<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
	<title>Blogs en español de la Comunidad Django.</title>
	<link>http://django.es/comunidad/</link>
	<description>Blogs en español de la Comunidad Django.</description>
	<language>es</language>

	<item>
	<title>Acelerando tests de Django con PostgreSql</title>
	<author>DynamicWare</author>
	<link>http://blog.hgdeoro.com.ar/2012/02/acelerando-tests-de-django-con.html</link>
	<guid>http://blog.hgdeoro.com.ar/2012/02/acelerando-tests-de-django-con.html</guid>
	<pubDate>sáb, 4 Feb 2012 00:00:00 +0100</pubDate>
	<description>La ejecucion inicial de los tests toma aproximadamente &lt;b&gt;15 segundos&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.54user 0.64system &lt;b&gt;0:15.25elapsed&lt;/b&gt; 34%CPU (0avgtext+0avgdata 123600maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.70user 0.54system &lt;b&gt;0:14.70elapsed&lt;/b&gt; 35%CPU (0avgtext+0avgdata 122992maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.46user 0.65system &lt;b&gt;0:14.85elapsed&lt;/b&gt; 34%CPU (0avgtext+0avgdata 122912maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Luego de ajustar los siguientes parametros:&lt;br /&gt;- fsync = off&lt;br /&gt;- synchronous_commit = off&lt;br /&gt;- wal_sync_method = fsync&lt;br /&gt;&lt;br /&gt;la ejecución toma aproximadamente &lt;b&gt;8.5 segundos&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.22user 0.56system &lt;b&gt;0:08.62elapsed&lt;/b&gt; 55%CPU (0avgtext+0avgdata 123024maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.32user 0.58system &lt;b&gt;0:08.97elapsed&lt;/b&gt; 54%CPU (0avgtext+0avgdata 123008maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.29user 0.50system &lt;b&gt;0:08.74elapsed&lt;/b&gt; 54%CPU (0avgtext+0avgdata 123040maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El tiempo se redujo casi a la mitad! Aunque esta configuración no es para nada recomendable para un equipo de producción, creo que vale la pena para ejecutar tests.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/957467034762846168-8789685896774061097?l=blog.hgdeoro.com.ar&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Corriendo tests con instancia de PostgreSql en ram</title>
	<author>DynamicWare</author>
	<link>http://blog.hgdeoro.com.ar/2012/02/corriendo-tests-con-instancia-de.html</link>
	<guid>http://blog.hgdeoro.com.ar/2012/02/corriendo-tests-con-instancia-de.html</guid>
	<pubDate>sáb, 4 Feb 2012 00:00:00 +0100</pubDate>
	<description>Otra manera de optimizar la ejecución de tests de Django, pero &lt;b&gt;SIN&lt;/b&gt; modificar la instalación de PostgreSql del sistema operativo es crear una &lt;b&gt;nueva instancia&lt;/b&gt;, corriendo totalmente en ram.&lt;br /&gt;&lt;br /&gt;Para crear una nueva instancia usamos &lt;b&gt;initdb&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;$ /usr/lib/postgresql/9.1/bin/&lt;/span&gt;&lt;b&gt;initdb&lt;/b&gt;&lt;span class=&quot;Apple-style-span&quot;&gt; \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; --pgdata=/dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; -U horacio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Y para lanzar la instancia en segundo plano:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;$ /usr/lib/postgresql/9.1/bin/&lt;b&gt;postgres&lt;/b&gt;&amp;nbsp;\&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; -F -i -p 5444 -S $((1024*64)) \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; -D /dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; --unix_socket_directory=/dev/shm/pgtesting \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;-r /dev/shm/pgtesting/postgresql.log &amp;amp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Luego creamos el usuario y BD para la aplicación Django:&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;psql -h 127.0.0.1 \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; -c &quot;create user vindler with password &#39;x&#39; superuser&quot; postgres&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;psql -h 127.0.0.1 \&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&amp;nbsp; &amp;nbsp; -c &quot;create database vindler owner vindler&quot; postgres&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Mejora en tiempos de ejecución de test: 28%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La ejecución de los tests con PostgreSql en disco, con las optimizaciones de mi &lt;a href=&quot;http://blog.hgdeoro.com.ar/2012/02/acelerando-tests-de-django-con.html&quot; target=&quot;_blank&quot;&gt;artículo anterior&lt;/a&gt;&amp;nbsp;tardan alrededor de &lt;b&gt;&lt;u&gt;7 segundos&lt;/u&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;7.071s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;5.44user 0.58system &lt;b&gt;0:10.40elapsed&lt;/b&gt; 57%CPU (0avgtext+0avgdata 122880maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+1184outputs (0major+16964minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;6.843s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;5.28user 0.65system &lt;b&gt;0:10.27elapsed&lt;/b&gt; 57%CPU (0avgtext+0avgdata 122976maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+1176outputs (0major+16956minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;7.032s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;5.42user 0.64system &lt;b&gt;0:10.42elapsed&lt;/b&gt; 58%CPU (0avgtext+0avgdata 124304maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+1168outputs (0major+17122minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Los mismos tests ejecutandose en la nueva instancia de PostgreSql totalmente en ram, tardan alrededor de &lt;b&gt;&lt;u&gt;5 segundos&lt;/u&gt;&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;5.220s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.41user 0.65system &lt;b&gt;0:08.38elapsed&lt;/b&gt; 60%CPU (0avgtext+0avgdata 117904maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;8inputs+1176outputs (0major+16524minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;5.047s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;4.32user 0.53system &lt;b&gt;0:08.04elapsed&lt;/b&gt; 60%CPU (0avgtext+0avgdata 117888maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+1168outputs (0major+16504minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 18 tests in &lt;b&gt;4.665s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;3.95user 0.64system &lt;b&gt;0:07.79elapsed&lt;/b&gt; 58%CPU (0avgtext+0avgdata 117856maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+1176outputs (0major+16502minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Al ejecutar los tests de stress: 33%&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Con PostgreSql en disco:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;24.601s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;15.21user 2.72system &lt;b&gt;0:27.98elapsed&lt;/b&gt; 64%CPU (0avgtext+0avgdata 130944maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+9616outputs (0major+18298minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;24.458s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;15.16user 2.51system &lt;b&gt;0:27.57elapsed&lt;/b&gt; 64%CPU (0avgtext+0avgdata 131488maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;472inputs+9608outputs (0major+18457minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;24.552s&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;15.23user 2.63system &lt;b&gt;0:27.95elapsed&lt;/b&gt; 63%CPU (0avgtext+0avgdata 131088maxresident)k&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;232inputs+9616outputs (0major+18310minor)pagefaults 0swaps&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Con PostgreSql en ram:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;16.082s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;11.30user 2.46system &lt;b&gt;0:19.22elapsed&lt;/b&gt; 71%CPU (0avgtext+0avgdata 126080maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+9616outputs (0major+17675minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;15.736s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;11.25user 2.20system &lt;b&gt;0:18.82elapsed&lt;/b&gt; 71%CPU (0avgtext+0avgdata 126192maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+9608outputs (0major+17684minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Ran 1 test in &lt;b&gt;15.408s&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;10.78user 2.27system &lt;b&gt;0:18.44elapsed&lt;/b&gt; 70%CPU (0avgtext+0avgdata 126384maxresident)k&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;0inputs+9608outputs (0major+17693minor)pagefaults 0swaps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/957467034762846168-67221169947802078?l=blog.hgdeoro.com.ar&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Instalando django_openid_auth usando PIP</title>
	<author>DynamicWare</author>
	<link>http://blog.hgdeoro.com.ar/2012/01/instalando-djangoopenidauth-usando-pip.html</link>
	<guid>http://blog.hgdeoro.com.ar/2012/01/instalando-djangoopenidauth-usando-pip.html</guid>
	<pubDate>mié, 25 Ene 2012 00:00:00 +0100</pubDate>
	<description>Hay algunos problemas con la version 0.4 de django_openid_auth (ej: no se puede instalar via pip). El proyecto es open source, por lo tanto es muy facil subirlo a GitHub y compartir estos arreglos :-)&lt;br /&gt;&lt;br /&gt;Básicamente bajé el proyecto original (revisión 88) y lo subi a GitHub. Para instalarlo usando PIP hay que ejecutar:&lt;br /&gt;&lt;br /&gt;./pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;Actualización&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Mucho mejor, instalamos usando PIP, pero un commit en particular (&lt;b&gt;ec68dfc046d1a75b50080ea98c56eda71956ed7a&lt;/b&gt;):&lt;br /&gt;&lt;br /&gt;pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@ec68dfc046d1a75b50080ea98c56eda71956ed7a#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;O&amp;nbsp;también un tag en particular (&lt;b&gt;bzr_revno_88&lt;/b&gt;):&lt;br /&gt;&lt;br /&gt;pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@bzr_revno_88#egg=django_openid_auth&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/957467034762846168-7669250292104658439?l=blog.hgdeoro.com.ar&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Editando y traduciendo inline en Django</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/contribuciones/2012/01/inline-editing-and-translating-in-django/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=inline-editing-and-translating-in-django</link>
	<guid>http://www.yaco.es/blog/contribuciones/2012/01/inline-editing-and-translating-in-django/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=inline-editing-and-translating-in-django</guid>
	<pubDate>lun, 9 Ene 2012 00:00:00 +0100</pubDate>
	<description>&lt;p&gt;La tarea de administrar un sitio web es una tarea de lo más complicada, influyendo en gran medida el desconocimiento de la tecnología usada y las carencias del administrador, el cual muchas veces no es técnico. &lt;a title=&quot;Django&quot; href=&quot;http://www.djangoproject.com&quot; target=&quot;_blank&quot;&gt;Django&lt;/a&gt; posee una administración muy potente, pero para un usuario no-programador a veces puede seguir siendo [...]</description>
	</item>

	<item>
	<title>Shell en django</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/12/shell-en-django.html</link>
	<guid>http://www.pvilas.com/2011/12/shell-en-django.html</guid>
	<pubDate>lun, 5 Dic 2011 00:00:00 +0100</pubDate>
	<description>Ocurre muchas veces que necesitamos una shell en django para realizar pruebas o tareas de mantenimiento. Conseguirla es muy sencillo ya que settings.py se cargará desde el primer momento en que importemos un modelo o cualquier módulo de django. &amp;nbsp;Lo único que tenemos que hacer es exportar la variable DJANGO_SETTINGS_MODULE con el valor del fichero de settings que queremos utilizar. Yo uso este script (suponiendo que nuestros settings están en settings.py):&lt;br /&gt;&lt;br /&gt;&lt;b&gt;shell.sh&lt;/b&gt;&lt;br /&gt;&lt;code&gt;export DJANGO_SETTINGS_MODULE=&quot;settings&quot;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;python&lt;/code&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;desde aquí ya podemos operar con los modelos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;from gesion.models import Cliente&lt;br /&gt;c=Cliente(clave=&#39;444&#39;, descripcion=&#39;Pepe Perez&#39;)&lt;br /&gt;c.save()&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Si queremos acceder desde un script independiente en python podemos usar setup_environ de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mantenimiento.py&lt;/b&gt;&lt;br /&gt;&lt;code&gt;from django.core.management import setup_environ&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;import settings&lt;br /&gt;except ImportError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;import sys&lt;br /&gt;&amp;nbsp;&amp;nbsp;sys.stderr.write(&quot;No encuentro el fichero de settings&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;sys.exit(1)&lt;br /&gt;&lt;br /&gt;setup_environ(settings)&lt;br /&gt;&lt;br /&gt;....&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-7698846370809270160?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>PyPI y Yaco</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/contribuciones/2011/12/pypi-y-yaco/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pypi-y-yaco</link>
	<guid>http://www.yaco.es/blog/contribuciones/2011/12/pypi-y-yaco/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pypi-y-yaco</guid>
	<pubDate>jue, 1 Dic 2011 00:00:00 +0100</pubDate>
	<description>&lt;p&gt;Desde su comienzo &lt;a href=&quot;http://www.yaco.es&quot;&gt;Yaco&lt;/a&gt; ha estado fuertemente ligada al Software Libre, siempre ha creído en el concepto de comunidad, por ello todo el equipo intenta usar, mejorar y contribuir a esta en todo lo posible.&lt;/p&gt; &lt;p&gt;Si desde el primer día Yaco ha tenido debilidad por el Software Libre, siempre ha tenido predilección por el [...]</description>
	</item>

	<item>
	<title>El nuevo Amigo Invisible Online</title>
	<author>Bosco Curtu</author>
	<link>http://bcurtu.com/?p=796</link>
	<guid>http://bcurtu.com/?p=796</guid>
	<pubDate>mié, 2 Nov 2011 00:00:00 +0100</pubDate>
	<description>Última hora!!! Tenemos un nuevo Amigo Invisible Online, la mejor forma de celebrar un amigo invisible por email. Bueno, no es última hora, pero como todavía no lo había blogeado, pues alguno no lo sabrá.
El nuevo amigo invisible, que por fuera se parece mucho al antiguo, tiene las siguientes funcionalidades:

Exclusiones múltiples. Era una funcionalidad muy [...]</description>
	</item>

	<item>
	<title>Participamos en el Día Python dentro de la Libre Software World Conference ’2011</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/eventos/2011/10/participamos-en-dia-python-dentro-libre-software-world-conference-2011/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=participamos-en-dia-python-dentro-libre-software-world-conference-2011</link>
	<guid>http://www.yaco.es/blog/eventos/2011/10/participamos-en-dia-python-dentro-libre-software-world-conference-2011/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=participamos-en-dia-python-dentro-libre-software-world-conference-2011</guid>
	<pubDate>mar, 25 Oct 2011 00:00:00 +0200</pubDate>
	<description>&lt;p&gt;En paralelo a la &lt;a href=&quot;http://libresoftwareworldconference.com/&quot; target=&quot;_blank&quot;&gt;“Libre Software World Conference &amp;#8217;2011” (LSWC&amp;#8217;11)&lt;/a&gt; que tendrá lugar en Zaragoza los días 9 y 10 de noviembre, se desarrollarán una serie de charlas dedicadas a &lt;a href=&quot;http://www.python.org/&quot; target=&quot;_blank&quot;&gt;Python&lt;/a&gt; para promocionar este lenguaje entre las empresas de Software Libre que acudan al evento, y entre las administraciones públicas en [...]</description>
	</item>

	<item>
	<title>Cómo resetear South</title>
	<author>DynamicWare</author>
	<link>http://blog.hgdeoro.com.ar/2011/10/como-resetear-south.html</link>
	<guid>http://blog.hgdeoro.com.ar/2011/10/como-resetear-south.html</guid>
	<pubDate>mié, 19 Oct 2011 00:00:00 +0200</pubDate>
	<description>Podemos resetear South desinstalándolo y volviéndolo a instalar.&amp;nbsp;&lt;b&gt;Atención&lt;/b&gt;: esto hará que se pierdan todas las migraciones existentes, y los datos de las BD de las aplicaciones que se quieran resetear. Los pasos a seguir son:&lt;br /&gt;&lt;br /&gt;1) eliminar de la BD las tablas de South: &lt;b&gt;south_migrationhistory&lt;/b&gt;.&lt;br /&gt;2)&amp;nbsp;eliminar de la BD&amp;nbsp;las tablas de las aplicaciones administradas por &lt;b&gt;south&lt;/b&gt;.&lt;br /&gt;3) eliminar el paquete&amp;nbsp;&lt;b&gt;migrations&lt;/b&gt;&amp;nbsp;de las aplicaciones que usen South.&lt;br /&gt;4) ejecutar &lt;b&gt;syncdb&lt;/b&gt;.&lt;br /&gt;5) volver a marcar las aplicaciones que deben ser administradas usando South, ejecutando: &quot;&lt;b&gt;manage.py convert_to_south APP&lt;/b&gt;&quot;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/957467034762846168-5941424449107498114?l=blog.hgdeoro.com.ar&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Uso correcto de super en python</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/10/uso-correcto-de-super-en-python.html</link>
	<guid>http://www.pvilas.com/2011/10/uso-correcto-de-super-en-python.html</guid>
	<pubDate>vie, 7 Oct 2011 00:00:00 +0200</pubDate>
	<description>Sea&lt;br /&gt;&lt;pre class=&quot;default prettyprint&quot;&gt;&lt;code&gt;&lt;span class=&quot;kwd&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;object&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; __init__&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;str&quot;&gt;&quot;Base created&quot;&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;ChildA&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; __init__&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;ChildB&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;Base&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; __init__&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;):&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;super&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;typ&quot;&gt;ChildB&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kwd&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;pln&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;pun&quot;&gt;()&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;¿Qué diferencia hay entre la construcción de A y de B?. Pues ninguna, lo que ocurre es que super nos permite mayor flexibilidad para gestionar la jerarquía ya que no tenemos que referirnos a una clase en particular.&lt;br /&gt;&lt;br /&gt;Usar super es también la única forma de hacer herencia múltiple aunque yo no la uso por ser fuente de errores.&lt;br /&gt;&lt;br /&gt;En python 3, la sintaxis se simplifica de super(ChildB,self).__init__() a super().__init().&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Fuentes:&lt;/i&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Understanding Python super() and init methods&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;How to use &#39;super&#39; in python&lt;/span&gt;&lt;br /&gt;&lt;a href=&quot;http://stackoverflow.com/questions/222877/how-to-use-super-in-python&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;http://stackoverflow.com/questions/222877/how-to-use-super-in-python&lt;/span&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-8449400333931544657?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>SQLite, Python y Django para llevar</title>
	<author>Código elusivo</author>
	<link>http://codigo-elusivo.blogspot.com/2008/11/sqlite-python-y-django-para-llevar.html</link>
	<guid>http://codigo-elusivo.blogspot.com/2008/11/sqlite-python-y-django-para-llevar.html</guid>
	<pubDate>sáb, 17 Sep 2011 00:00:00 +0200</pubDate>
	<description>Alguien ha tenido la excelente idea de crear una implementación portable de Django. Esto implica que SQLite y Python vienen como parte del conjunto.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.instantdjango.com/&quot; target=&quot;New&quot;&gt;Instant Django&lt;/a&gt; es para Windows. No tiene que instalarse,  se descomprime en una carpeta de la computadora o de una memoria portátil, se configura ejecutando el archivo start.bat  y listo, ya se cuenta con SQLite, Python y Django para desarrollar aplicaciones. Evidentemente, el principal objetivo de este conjunto de aplicaciones es el desarrollo de aplicaciones para Internet con el marco de trabajo Django, que por cierto, vale mucho la pena dedicar un tiempo a conocerlo, pero eso no hace forzoso que SQLIte o Python deban tener una aplicación práctica exclusivamente con Django, se les puede usar de modo independiente.&lt;br /&gt;&lt;br /&gt;Actualmente, &lt;a href=&quot;http://www.instantdjango.com/&quot; target=&quot;New&quot;&gt;Instant Django&lt;/a&gt; incluye Python 2.5.2, Django 1.0, Notepad++ 5.0.3, Python Imaging Library 1.1.6, Docutils 0.5, y Sqlite 3.5.6, viene muy actualizado.&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://s3.amazonaws.com/instant.django/django.exe&quot;&gt;Descarga directa: django.exe 17MB&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/3683270025490382428-6804628245083962720?l=codigo-elusivo.blogspot.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Campos de un modelo en Django</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/09/campos-de-un-modelo-en-django.html</link>
	<guid>http://www.pvilas.com/2011/09/campos-de-un-modelo-en-django.html</guid>
	<pubDate>vie, 9 Sep 2011 00:00:00 +0200</pubDate>
	<description>Podemos acceder a los campos de un modelo de la siguiente forma:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; from django.db import models&lt;br /&gt;&gt;&gt;&gt; from personal.models import Seccion&lt;br /&gt;&gt;&gt;&gt; campos=Seccion._meta.fields&lt;br /&gt;&gt;&gt;&gt; print campos&lt;br /&gt;django.db.models.fields.AutoField object at 0x96a33ac, ...&lt;br /&gt;&gt;&gt;&gt; for a in campos:&lt;br /&gt;...&amp;nbsp;&amp;nbsp;print a.name&lt;br /&gt;... &lt;br /&gt;id&lt;br /&gt;convenio&lt;br /&gt;descripcion&lt;br /&gt;hora_corte&lt;br /&gt;&gt;&gt;&gt; &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Toda la información del modelo está en el _meta. Un modelo puede cargarse dinámicamente con:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;model = models.get_model(&#39;aplicacion&#39;, &#39;Modelo&#39;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Todas las opciones están bien documentadas en el fuente &lt;a href=&quot;https://code.djangoproject.com/browser/django/trunk/django/db/models/options.py&quot;&gt;django/db/models/options.py&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-5621896125078236653?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>psycopg2 (2.4.2) + Django (1.3) = problemas!</title>
	<author>DynamicWare</author>
	<link>http://blog.hgdeoro.com.ar/2011/08/psycopg2-242-django-13-problemas.html</link>
	<guid>http://blog.hgdeoro.com.ar/2011/08/psycopg2-242-django-13-problemas.html</guid>
	<pubDate>mié, 10 Ago 2011 00:00:00 +0200</pubDate>
	<description>&lt;br /&gt;&lt;div&gt;Si usas psycopg2 versión 2.4.2 con Django 1.3 surge el siguiente problema:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;$ ./virtualenv27/bin/python src/dynamicware/manage.py test myprojects&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;Creating test database for alias &#39;default&#39;...&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;(...)&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;b&gt;psycopg2.ProgrammingError: autocommit cannot be used inside a transaction&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Una solución temporal es instalar la versión anterior de&amp;nbsp;psycopg2:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;$ ./virtualenv27/bin/pip install psycopg2==2.4.1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;La solución definitiva ya existe:&amp;nbsp;&lt;a href=&quot;https://code.djangoproject.com/ticket/16250&quot;&gt;https://code.djangoproject.com/ticket/16250&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/957467034762846168-3791688094067259013?l=blog.hgdeoro.com.ar&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>El futuro de django</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/08/el-futuro-de-django.html</link>
	<guid>http://www.pvilas.com/2011/08/el-futuro-de-django.html</guid>
	<pubDate>sáb, 6 Ago 2011 00:00:00 +0200</pubDate>
	<description>http://marakana.com/forums/python/python/419.html&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-8861980576640812499?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>La importancia de la colaboración y el retorno tecnológico a la comunidad como modelo de negocio</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/yaco/2011/07/la-importancia-colaboracion-y-retorno-tecnologico-comunidad-como-modelo-negocio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=la-importancia-colaboracion-y-retorno-tecnologico-comunidad-como-modelo-negocio</link>
	<guid>http://www.yaco.es/blog/yaco/2011/07/la-importancia-colaboracion-y-retorno-tecnologico-comunidad-como-modelo-negocio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=la-importancia-colaboracion-y-retorno-tecnologico-comunidad-como-modelo-negocio</guid>
	<pubDate>lun, 4 Jul 2011 00:00:00 +0200</pubDate>
	<description>&lt;p&gt;Desde &lt;a href=&quot;http://www.yaco.es/&quot;&gt;Yaco Sistemas&lt;/a&gt; centramos y optimizamos nuestras inversiones en la colaboración y el retorno tecnológico a la comunidad, un modelo que aporta ventajas competitivas frente a otras empresas en el mercado.&lt;/p&gt; &lt;p&gt;Sistemas operativos, frameworks de desarrollo web, bases de datos y otras muchas piezas de software con las que trabajamos están basadas en tecnologías [...]</description>
	</item>

	<item>
	<title>Desgranamos las claves de nuestro modelo de negocio</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/yaco/2011/06/desgranamos-claves-nuestro-modelo-negocio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=desgranamos-claves-nuestro-modelo-negocio</link>
	<guid>http://www.yaco.es/blog/yaco/2011/06/desgranamos-claves-nuestro-modelo-negocio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=desgranamos-claves-nuestro-modelo-negocio</guid>
	<pubDate>mar, 28 Jun 2011 00:00:00 +0200</pubDate>
	<description>&lt;p&gt;Después de casi 10 años dedicados a la innovando, creando profesionales, aportando valor a las comunidades de open source, ganando terreno a los más grandes del mercado tecnológico y consiguiendo una reputación, desgranamos las claves de nuestro modelo de negocio de la mano de Gaceta Tecnológica. Un modelo basado en la transparencia y que es [...]</description>
	</item>

	<item>
	<title>Impresiones de la DjangoCon Europe 2011</title>
	<author>Yaco</author>
	<link>http://www.yaco.es/blog/eventos/2011/06/impresiones-djangocon-europe-2011/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=impresiones-djangocon-europe-2011</link>
	<guid>http://www.yaco.es/blog/eventos/2011/06/impresiones-djangocon-europe-2011/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=impresiones-djangocon-europe-2011</guid>
	<pubDate>mar, 28 Jun 2011 00:00:00 +0200</pubDate>
	<description>&lt;p&gt;Por Manuel Saelices&lt;br /&gt; Chief Developer en Yaco&lt;/p&gt; &lt;p&gt;He tenido el placer de poder asistir a la &lt;a href=&quot;http://2011.djangocon.eu/&quot; target=&quot;_blank&quot;&gt;DjangoCon Europe&lt;/a&gt; que tuvo lugar en Ámsterdam. En contra de lo que se puede suponer a priori, el viaje a Ámsterdam fue de todo menos un viaje de ocio. Con decir que tuve que [...]</description>
	</item>

	<item>
	<title>Cuidado con el directorio de instalación de django</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/06/cuidado-con-el-directorio-de.html</link>
	<guid>http://www.pvilas.com/2011/06/cuidado-con-el-directorio-de.html</guid>
	<pubDate>lun, 20 Jun 2011 00:00:00 +0200</pubDate>
	<description>El directorio de instalación, tal y como indica el &lt;a href=&quot;https://docs.djangoproject.com/en/dev/topics/install/#remove-any-old-versions-of-django&quot;&gt;manual&lt;/a&gt; , lo obtenemos con &lt;br /&gt;&lt;code&gt;&lt;br /&gt;from distutils.sysconfig import get_python_lib;print get_python_lib()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;y muestra&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/usr/lib/python2.6/dist-packages&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Peeero, en realidad en ubuntu se instala en&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/usr/local/lib/python2.6/dist-packages&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;¿Cómo podemos saber la localización de este directorio?. Pues usando la librería sys, que mantiene la localización del __init__.py de cada import:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) &lt;br /&gt;[GCC 4.4.3] on linux2&lt;br /&gt;Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.&lt;br /&gt;&gt;&gt;&gt; import sys, os, django        &lt;br /&gt;&gt;&gt;&gt; sys.modules[&#39;django&#39;]&lt;br /&gt;module &#39;django&#39; from &#39;/usr/local/lib/python2.6/dist-packages/django/__init__.pyc&#39;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Sacado de esta entrada de stackoverflow http://stackoverflow.com/questions/2647862/how-can-i-tell-what-directory-an-imported-library-comes-from-in-python&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-5005660993842093132?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Opciones para programación con vi / vim</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/06/opciones-para-programacion-con-vi-vim.html</link>
	<guid>http://www.pvilas.com/2011/06/opciones-para-programacion-con-vi-vim.html</guid>
	<pubDate>dom, 19 Jun 2011 00:00:00 +0200</pubDate>
	<description>Esta es la config que uso en ~/.vimrc&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;syntax on&lt;br /&gt;set number&lt;br /&gt;set expandtab&lt;br /&gt;set tabstop=4&lt;br /&gt;set shiftwidth=4&lt;br /&gt;set foldmethod=marker&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;para editar python.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-7417291972257029184?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Django: Evitar error en el administrador &quot;decoding Unicode is not supported&quot;</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/03/django-evitar-error-en-el-administrador.html</link>
	<guid>http://www.pvilas.com/2011/03/django-evitar-error-en-el-administrador.html</guid>
	<pubDate>vie, 11 Mar 2011 00:00:00 +0100</pubDate>
	<description>Si, como es probable, os habéis encontrado con este error en el administrador cuando examináis modelos con caracteres utf-8, creo que puede deberse al hecho de que django sirve los strings en unicode pero sin codificar.&lt;br /&gt;&lt;br /&gt;En python, en el momento que intentamos algo como esto:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&gt;&gt;&gt; unicode(&#39;pepe&#39;, &#39;utf-8&#39;)&lt;br /&gt;u&#39;pepe&#39;&lt;br /&gt;&gt;&gt;&gt; unicode(u&#39;pepe&#39;, &#39;utf-8&#39;)&lt;br /&gt;&lt;br /&gt;Traceback (most recent call last):&lt;br /&gt;File &quot;&quot;, line 1, in &lt;br /&gt;TypeError: decoding Unicode is not supported&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;Obtenemos el TypeError. En el admin de django, el error lo obtendremos siempre que grabemos caracteres &gt;255. Parece provenir del hecho de codificar el unicode en ascii en vez de utf-8 ¿?.&lt;br /&gt;&lt;br /&gt;Si hacemos:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def __unicode__(self):&lt;br /&gt;   return unicode(self.descripcion)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Obtendremos el error de decodificación ascii, pero si hacemos...&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def __unicode__(self):&lt;br /&gt;   return unicode(self.descripcion, &#39;utf-8&#39;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;...nos funcionará pero no podremos usar el admin para examinar el modelo porque nos genera el error anterior.&lt;br /&gt;&lt;br /&gt;Tenemos dos posibilidades, aunque no las comprendo en profundidad:&lt;br /&gt;&lt;br /&gt;Solución 1):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;from django.utils.encoding import smart_unicode&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;En los modelos poner:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def __unicode__(self):&lt;br /&gt;   return smart_unicode((&quot;%s&quot; % self.descripcion))&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Solución 2) Llamado &quot;método del literal&quot;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;def __unicode__(self):&lt;br /&gt;   return (u&quot;%s&quot; % self.descripcion)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;En todo caso es conveniente poner el setting&lt;br /&gt;&lt;code&gt;&lt;br /&gt;DEFAULT_CHARSET=&#39;utf-8&#39;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;que fuerza utf-8 a la hora de procesar y servir las plantillas.&lt;br /&gt;&lt;br /&gt;Más info sobre este tema estaría bien. En mi caso uso mysql con utf-8 y ordenación spanish2, ubuntu 10.10 con utf-8 y apache forzado a servir utf-8.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-6076735820115786324?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Django: Guardar imágenes (o blobs) desde la red</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/03/django-guardar-imagenes-o-blobs-desde.html</link>
	<guid>http://www.pvilas.com/2011/03/django-guardar-imagenes-o-blobs-desde.html</guid>
	<pubDate>jue, 10 Mar 2011 00:00:00 +0100</pubDate>
	<description>Debido a las consultas amplío el post anterior para aclarar un poco el proceso suponiendo que bajamos las imágenes desde un servidor sFTP, sólo hay que cambiar los parámetros de pycurl para operar con http, https, etc...&lt;br /&gt;&lt;br /&gt;Primero bajamos la imagen a memoria con algún gestor (pycurl por ejemplo o urllib) y guardarlo en un cStringIO:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;import pycurl, cStringIO&lt;br /&gt;&lt;br /&gt;buf = cStringIO.StringIO() &lt;br /&gt;url=(&#39;ftps://%s:990/%s&#39; % (ip, fichero))&lt;br /&gt;privatekey = &#39;/home/sss/.ssh/id_rsa&#39;&lt;br /&gt;options = {&lt;br /&gt;  pycurl.USERPWD: &#39;xxxxx:xxxx&#39;,&lt;br /&gt;  pycurl.SSLKEYPASSWD: &#39;adfasdfasdfas&#39;,&lt;br /&gt;  pycurl.SSH_PRIVATE_KEYFILE: privatekey,&lt;br /&gt;  pycurl.SSH_PUBLIC_KEYFILE: privatekey + &#39;.pub&#39;,&lt;br /&gt;  #pycurl.WRITEDATA: open(&#39;/dev/null&#39;, &#39;wb&#39;),&lt;br /&gt;  pycurl.VERBOSE: 1,&lt;br /&gt;  pycurl.URL: url,&lt;br /&gt;  pycurl.HEADER: 1,&lt;br /&gt;  pycurl.NOBODY: 1,&lt;br /&gt;  pycurl.WRITEFUNCTION: buf.write,&lt;br /&gt;  pycurl.NOPROGRESS: 1,&lt;br /&gt;  pycurl.SSL_VERIFYPEER: 0,&lt;br /&gt;  pycurl.SSL_VERIFYHOST: 0,&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;gestor = pycurl.Curl()&lt;br /&gt;try:&lt;br /&gt;for (k, v) in options.items():&lt;br /&gt;  print k, v&lt;br /&gt;  gestor.setopt(k, v)&lt;br /&gt;except Exception, msg:&lt;br /&gt;  logging.info(&#39;Error setopt %s&#39; % msg)&lt;br /&gt;&lt;br /&gt;gestor.perform()&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora ya tenemos la imagen en memoria (buf), vamos a grabarla (django la graba en disco y en la db solo se guarda el path), el único problema es que ImageField espera un campo file, pero lo solucionaremos con un workaround:&lt;br /&gt;&lt;br /&gt;En tu modelo pones:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;class Persona(models.Model):&lt;br /&gt; .....&lt;br /&gt; imagen=models.ImageField(upload_to=settings.PATH_FOTOS_CLIENTES, blank=True)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Donde settings.PATH_FOTOS_CLIENTES apunta a la ruta que cuelga de la ruta que tengas en settings.MEDIA_ROOT y tiene el formato siguiente o similar (en settings.py):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;PATH_FOTOS_CLIENTES=&#39;clientes/%Y/%m/%d&#39;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ahora tenemos que pasar de la imagen que tienes cargada en memoria a un stream tipo &#39;file&#39; para que pueda ser guardado por el modelo:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;from django.core.files.uploadedfile import SimpleUploadedFile&lt;br /&gt;&lt;br /&gt;foto = SimpleUploadedFile(&#39;imagencliente.jpg&#39;,&lt;br /&gt;         buf.getvalue(),&lt;br /&gt;         &quot;image/jpeg&quot;)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;y ya salvamos:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;p=Persona( imagen=foto )&lt;br /&gt;p.save()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Comentad si os surge alguna duda.&lt;br /&gt;Saludos,&lt;br /&gt;Pere Vilás.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-2953339392842286224?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Django en la red con el servidor de desarrollo</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/03/django-en-la-red-con-el-servidor-de.html</link>
	<guid>http://www.pvilas.com/2011/03/django-en-la-red-con-el-servidor-de.html</guid>
	<pubDate>mié, 9 Mar 2011 00:00:00 +0100</pubDate>
	<description>No basta con python manage.py runserver [num_puerto], esto sólo lo hace accesible desde loopback, para servir en red hay que hacer&lt;br /&gt;&lt;code&gt;&lt;br /&gt;python manage.py runserver [ip_fisica]:[num_puerto]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Para saber nuestra ip podemos hacerlo con ifconfig, evidentemente no podemos usar localhost o 127.0.0.1&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-3701321002569746607?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Django: Guardar imágenes desde string</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/03/django-guardar-imagenes-desde-string.html</link>
	<guid>http://www.pvilas.com/2011/03/django-guardar-imagenes-desde-string.html</guid>
	<pubDate>mié, 9 Mar 2011 00:00:00 +0100</pubDate>
	<description>Para guardar una imagen en un campo de tipo ImageField de Model desde una cadena como un POST http o desde memoria hacemos lo siguiente:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;from django.core.files.uploadedfile import SimpleUploadedFile&lt;br /&gt;import cStringIO&lt;br /&gt;&lt;br /&gt;buf = cStringIO.StringIO()     &lt;br /&gt;# adquirimos imagen y la guardamos en buf i.e. mediante pycurl&lt;br /&gt;&lt;br /&gt;foto = SimpleUploadedFile(&#39;imagen.jpg&#39;, buf.getvalue(), &quot;image/jpeg&quot;)  &lt;br /&gt;&lt;br /&gt;# ahora foto contiene el stream pero en formato &#39;fichero&#39;&lt;br /&gt;&lt;br /&gt;p=Modelo( imagen=foto )&lt;br /&gt;p.save()&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Espero que os sirva ;-)&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-4842941822219677402?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>Consultas en Django</title>
	<author>Estribancus</author>
	<link>http://www.pvilas.com/2011/02/consultas-en-django.html</link>
	<guid>http://www.pvilas.com/2011/02/consultas-en-django.html</guid>
	<pubDate>jue, 24 Feb 2011 00:00:00 +0100</pubDate>
	<description>&lt;div&gt;&lt;h1 id=&quot;internal-source-marker_0.23160702199675143&quot;&gt;&lt;span class=&quot;Apple-style-span&quot;&gt;Unos pequeños apuntes cogidos al vuelo de consultas en django&lt;/span&gt;&lt;/h1&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Un queryset sería el equivalente a un SELECT&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Un filter sería el equivalente a un WHERE&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Comandos de Query:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Objeto.objects.all() -&gt; Todo el conjunto&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Objeto.objects.filter() -&gt; Un filtro para incluir&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Objeto.objects.exclude() -&gt; Un filtro para excluir&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Objeto.objects.get() -&gt; Busca un solo objeto&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Encadenado de filtros&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Entry.objects.filter(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt; &lt;/span&gt;headline__startswith=’What’&lt;/span&gt;&lt;br /&gt;&lt;span&gt;).exclude(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt; &lt;/span&gt;pub_date__gte=datetime.now()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;).filter(&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span class=&quot;Apple-tab-span&quot;&gt; &lt;/span&gt;pub_date__gte=datetime(2005,1,1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Todos los que empiezan por What entre 1/1/2005 y ahora.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Cada filtro crea una consulta única&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;q1=Entry.objects.filter(headline__startswith=’What’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;q2=q1.exclude(pub_date__gte=datetime.now())&lt;/span&gt;&lt;br /&gt;&lt;span&gt;q3=q2.filter(pub_date__gte=datetime(2005,1,1))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Buscar un solo objeto con get()&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;one_entry=Entry.objects.get(pk=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Si no hay datos salta la excepción DoesNotExist&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;En cambio filter()[0], no hace nada&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Limitar el número de registros devueltos&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Entry.objects.all()[:5]  # los cinco primeros&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Entry.objects.all()[5:10]  # del quinto al décimo&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Buscar sobre campos&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Básicos: Son de la forma campo__tipobusqueda=valor&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Ejemplo: Entry.objects.filter(pub_date___lte=’2006-01-01’) se transforma en select from blog_entry where pub_date&lt;=’2006-01-01’&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-&gt; exact : headline__exact=’algo’&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-&gt; iexact: case insentive exact&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-&gt; contains&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-&gt; startswith&lt;/span&gt;&lt;br /&gt;&lt;span&gt;-&gt; endswith&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Relacionales&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Entry.objects.filter(blog__name__exact=’Pep’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Blogs.objects.filter(entry__headline__contains=’Pep’, entry__pub_date__year=2006) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;Todos los blogs que tengan alguna entrada cuyo titulo tenga Pep y se haya publicado en 2006&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Blogs.objects.filter(entry__headline__contains=’Pep’).filter(entry__pub_date__year=2006) &lt;/span&gt;&lt;br /&gt;&lt;span&gt;Todos los que tengan Pep y todos los que se hayan publicado en 2006&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Filtros que referencian a otros campos del mismo modelo&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;from django.db.models import F&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Entry.objects.filter(n_coments__gt=F(‘n_pingbacks’))&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;gt: greather than&lt;/span&gt;&lt;br /&gt;&lt;span&gt;n_pingbacks: valor de otro campo del mismo modelo&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Primary key&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Blog.objects.get(pk=valor)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;.get(pk__in=[1,4,7])&lt;/span&gt;&lt;br /&gt;&lt;span&gt;.get(pk__gt=14)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Caching&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Esta consulta se realiza dos veces:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;print [e.headline from p in queryset]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;print [e.pub_date from p in queryset]&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Esta, sólo una vez (cacheo de resultados):&lt;/span&gt;&lt;br /&gt;&lt;span&gt;queryset=Entry.objects.all()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;print [p.headline form p in queryset] &lt;- En esta se cachea&lt;/span&gt;&lt;br /&gt;&lt;span&gt;print [p.pub_date form p in queryset] &lt;- en esta su usa la caché&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Consultas complejas con Q&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Las palabras clave en filter, etc... son ANDs, si queremos algo más complejo, necesitamos Qs&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;django.db.models.Q&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Q(question__startswith=’Who’) | Q(question__startswith=’What’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Q(question__startswith=’Who’) | ~Q(question__startswith=’What’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Poll.objects.get( Q(question__startswith=’Who’), &lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span&gt;Q(pub_date=date(2005,5,2)) | Q(pub_date=date(2005,5,6)) )&lt;/span&gt;&lt;/p&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Comparando objetos&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Para comparar dos objetos usamos el == estándar de python&lt;/span&gt;&lt;br /&gt;&lt;span&gt;una_entrada==otra_entrada&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;La comparación se realiza siempre usando la clave primaria&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Borrando objetos&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Entry.objects.filter(pub_date__year=2005).delete()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Borra todos los elementos y los foreign key que le apuntan &lt;/span&gt;&lt;span&gt;en cascada&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b=Blogs.objects.get(pk=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b.delete()  -&gt; borra la entrada y todos sus comentarios&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Update de varios elementos&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Entry.objects.filter().update(headline=’Cambiado’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h4&gt;&lt;span&gt;Objetos relacionados&lt;/span&gt;&lt;/h4&gt;&lt;span&gt;Si un modelo tiene un foreign key, podemos acceder al objeto foráneo via simple atributo del modelo:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;e=Blog.objects.get(id=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;e.entry_set.all() --&gt; todas las entradas del primer blog&lt;/span&gt;&lt;br /&gt;&lt;span&gt;e.entry_set.filter(headline__contains=’Pep’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Si se ha usado el related_name en la definición del modelo, entonces ese es el nombre del atributo para acceder&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;blog=ForeignKey(Blog, related_name=’entries’)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b=Blog.objects.get(id=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b.entries.all()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b.entries.count()&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Métodos del Foreign Manager:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;relacionado.add(ob1, obj2, …) Añade al objeto relacionado&lt;/span&gt;&lt;br /&gt;&lt;span&gt;relacionado.create(**kwargs)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;relacionado.remove(obj1, obj2, …)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;relacionado.clear()  -&gt; borra todos los objetos relacionados&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;O también:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b=Blog.objects.get(id=1)&lt;/span&gt;&lt;br /&gt;&lt;span&gt;b.entry_set=[e1, e2, …] &lt;- un objeto iterable&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;Hacer siempre el save del objeto principal para que permanente.&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&quot;1&quot; height=&quot;1&quot; src=&quot;https://blogger.googleusercontent.com/tracker/9191328551308072706-7208246413595847923?l=www.pvilas.com&quot; alt=&quot;&quot; /&gt;&lt;/div&gt;</description>
	</item>

	<item>
	<title>django-membergetmember</title>
	<author>Bosco Curtu</author>
	<link>http://bcurtu.com/?p=772</link>
	<guid>http://bcurtu.com/?p=772</guid>
	<pubDate>jue, 17 Feb 2011 00:00:00 +0100</pubDate>
	<description>He liberado una nueva app para django para la gestión de campañas Member-Get-Member al estilo groupon y otros. Tu traes un amigo y yo os doy X créditos a cada uno. Más info en el README del proyecto en github
Feedback is welcome</description>
	</item>

	<item>
	<title>django-sermepa</title>
	<author>Bosco Curtu</author>
	<link>http://bcurtu.com/?p=768</link>
	<guid>http://bcurtu.com/?p=768</guid>
	<pubDate>mié, 2 Feb 2011 00:00:00 +0100</pubDate>
	<description>Acabo de subir al github una versión sencilla para utilizar el TPV Virtual de Sermepa: django-sermepa
Django-sermepa funciona de una forma muy parecida a django-paypal IPN:

En una página renderiza un formulario oculto y un botón de &amp;#8220;Comprar&amp;#8221;
Esto te lleva al TPV Virtual de Sermepa (Servired) donde se paga
Sermepa envía un post (el IPN de paypal) a [...]</description>
	</item>

	<item>
	<title>Comportamiento “raro” en Django</title>
	<author>Humitos</author>
	<link>http://humitos.wordpress.com/2010/11/16/comportamiento-raro-en-django/</link>
	<guid>http://humitos.wordpress.com/2010/11/16/comportamiento-raro-en-django/</guid>
	<pubDate>mié, 17 Nov 2010 00:00:00 +0100</pubDate>
	<description>En pocas palabras tengo un modelo que obtengo desde su id que me viene por la url. Para esto utilizo la función get_object_or_404 que trae Django. En el medio de la vista de Django aplico algunas funciones a esta instancia del modelo y me estoy encontrando con que luego de aplicar funciones que modifican la [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=humitos.wordpress.com&amp;blog=1616317&amp;post=419&amp;subd=humitos&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	</item>

	<item>
	<title>Facebook App</title>
	<author>Humitos</author>
	<link>http://humitos.wordpress.com/2010/09/18/facebook-app/</link>
	<guid>http://humitos.wordpress.com/2010/09/18/facebook-app/</guid>
	<pubDate>sáb, 18 Sep 2010 00:00:00 +0200</pubDate>
	<description>Si bien Facebook no me gusta mucho, más que nada por el uso que la gente le da, y no porque sea una aplicación que no me gusta; de hecho, me parece que es muy groso y fue revolucionario. Fue tan revolucionario que la gente quiere hacer aplicaciones para que se vean dentro de Facebook [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=humitos.wordpress.com&amp;blog=1616317&amp;post=378&amp;subd=humitos&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	</item>

	<item>
	<title>Introducción a Django (charla)</title>
	<author>Humitos</author>
	<link>http://humitos.wordpress.com/2010/09/11/introduccion-a-django-charla/</link>
	<guid>http://humitos.wordpress.com/2010/09/11/introduccion-a-django-charla/</guid>
	<pubDate>sáb, 11 Sep 2010 00:00:00 +0200</pubDate>
	<description>Es la primera vez que voy a hacer esto, no estoy seguro porqué se me ocurrió en este momento, pero ya lo había visto en el blog de Juanjo hace un tiempo aunque no le dí mucha bola y ahora que me surgió la idea nuevamente, me acordé que ya lo había visto y que [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=humitos.wordpress.com&amp;blog=1616317&amp;post=303&amp;subd=humitos&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	</item>

	<item>
	<title>Introducción a Django Reloaded</title>
	<author>Humitos</author>
	<link>http://humitos.wordpress.com/2010/09/06/introduccion-a-django-reloaded/</link>
	<guid>http://humitos.wordpress.com/2010/09/06/introduccion-a-django-reloaded/</guid>
	<pubDate>lun, 6 Sep 2010 00:00:00 +0200</pubDate>
	<description>La última vez que dí una charla si mal no recuerdo fue hace un año atrás en la PyCon de Argentina. La verdad que estoy re oxidado con esto. Hace un tiempo cuando Facundo me ofreció dar una charla de Introducción a Django en el ciclo de charlas organizadas por FM La Tribu le dije que [...]&lt;img alt=&quot;&quot; border=&quot;0&quot; src=&quot;http://stats.wordpress.com/b.gif?host=humitos.wordpress.com&amp;blog=1616317&amp;post=294&amp;subd=humitos&amp;ref=&amp;feed=1&quot; width=&quot;1&quot; height=&quot;1&quot; /&gt;</description>
	</item>

</channel>
</rss>

