Archive for February, 2008

Relaciones en modelos de datos con Django

Fuente: http://www.djangoproject.com/documentation/model-api/#relationships Una pequeña traducción a mi manera y para mi...

Evidentemente, el poder de las base de datos relaciones se basa en la relación de las mismas tablas. Django ofrece caminos para definir los 3 tipos mas comunes de relaciones en tablas relacionales (n:1, uno a muchos) many-to-one, (n:n, muchos a muchos) many-to-many, (1:1, una o uno) one-to-one.

Relación many-to-one (n:1)
Para definir una relación many-to-one, usamos ForeignKey. Lo usamos como otro tipo de Campo, incluyéndolo en la clase modelo como atributo.

ForeignKey requiere un argumento de posición, la clase con la cual se relaciona a traves de ese Campo.

Por ejemplo, si en un modelo que tenemos Car este tiene a Manufacturer (un Manufacturer, hace múltiples coches pero un coche solo tiene un fabricante) usa las siguientes definiciones:

PYTHON:
  1. class Manufacturer(models.Model):
  2.     # ...
  3.  
  4. class Car(models.Model):
  5.     manufacturer = models.ForeignKey(Manufacturer)
  6.     # ...

Para crear una relación recursiva ( un objeto tiene una relacion many-to-one consigo mismo) usamos models.Foreignkey('self').

Si necesitas crear una relación en un modelo que todavía no se ha definido, puedes usar el nombre del modelo

PYTHON:
  1. class Car(models.Model):
  2.     manufacturer = models.ForeignKey('Manufacturer')
  3.     # ...
  4.  
  5. class Manufacturer(models.Model):
  6.     # ...

Sin embargo, solo puedes usar strings para referirte a modelos que esten en el mismo fichero (models.py) ( no puedes usar un string que hace referencia a un modelo de diferentes aplicaciones o a un modelo que esta siendo importado en otros sitios.

Interiormente Django añade "_id" al nombre del campo con el cual se crea el nombre de la columna en la BD, en el ejemplo de arriba, la tabla Car tiene una columna que se llama manufacturer_id. (Puedes cambiar explícitamente db_column)

Sin embargo, tu código nunca deberá tener el nombre de la columna, a menos que escribas SQL personalizado, Siempre trataras con los nombres de los campos del modelo.

Una sugerencia, pero no requerimiento, seria que el nombre del campo Foreignkey (manufacturer en el ejemplo anterior) sea el nombre del modelo en minúsculas. Puedes por supuesto llamar al campo como quieras por ejemplo:

PYTHON:
  1. class Car(models.Model):
  2.     company_that_makes_it = models.ForeignKey(Manufacturer)
  3.     # ...

Relaciones many-to-many
Para definir una relación many-to-many, usamos ManyToManyField, lo usamos como cualquier tipo de campo, incluyéndolo como atributo de la clase del modelo.

ManyToManyField requiere un argumento posicional: la clase con la cual se relaciona a través de ese Campo.

Por ejemplo, si una Pizza tiene múltiples Objetos Topping (un Topping puede estar en múltiples pizzas y cada pizza tiene múltiples toppings) esto queda representado así:

PYTHON:
  1. class Topping(models.Model):
  2.     # ...
  3.  
  4. class Pizza(models.Model):
  5.     # ...
  6.     toppings = models.ManyToManyField(Topping)

Como con ForeignKey, una relación consigo misma es definida usando el string 'self' en lugar del nombre del modelo, y puedes referirte a los que todavia no se han definido usando un string con el nombre del modelo. Sin embargo, solo puedes usar strings para referirte a modelos que estén en el mismo fichero (models.py) ( no puedes usar un string que hace referencia a un modelo de diferentes aplicaciones o a un modelo que esta siendo importado en otros sitios.

Una sugerencia, pero no requerimiento, es que el nombre del campo tipo ManyToManyField (toppings en el ejemplo anterior) sea un plural que describa el conjunto de objetos relacionados con el modelo, "toppings = models.ManyToManyField(Topping)"

Internamente, Django crea una tabla unión intermedia para la relación (n:n) many-to-many.

No importa en que modelo tengas el ManyToManyField, pero solo lo necesitas en uno de los modelos no en ambos.

Generalmente el campo ManyToManyField debe ir en el objeto que sera editado en la admin. Si estas usando Django Admin. En el ejemplo anterior, toppings esta en Pizza (en vez de que Topping tenga un campo pizzas de tipo ManyToManyField) porque es mas natural pensar sobre que Pizza tiene toppings, aunque topping esta en múltiples pizzas. Es camino esta en poner por encima esto para que en el Formulario de Admin del modelo Pizza los usuarios seleccionen los ingredientes.

Mirar el modelo de ejemplo de relaciones tipo many-to-many en un ejemplo completo

El objeto ManyToManyField tiene mas argumentos para definir como debe trabajar su relación, todos son opcionales.

Relaciones one-to-one (1:1)

La semántica de las relaciones uno a uno cambiaran pronto, De modo que no recomendamos su uso.

Problemas con django, DJANGO_SETTINGS_MODULE

Problemas con variables de entorno de django concretamente DJANGO_SETTINGS_MODULE.
Error

ENVIRONMENT_VARIABLE
ImportError: Settings cannot be imported, because environment
variable DJANGO_SETTINGS_MODULE is undefined.

El interprete de python no tiene valor para la variable DJANGO_SETTINGS_MODULE.

Solucion
Una facil es arrancar el interprete desde el directorio del site y arrancarlo asi:

python manage.py shell

y listo, otra manera mas elegante es desde vuestro interprete preferido (console, pyshell, etc...) ejecutar al principio de todo algo asi como esto:

from django.conf import settings
settings.configure()

Y con esto y un bizcocho hasta mañana a las 8.

Como hacer preguntas en foros, grupos de noticias, etc…

Durante el desarrollo del proyecto que me hará rico.... estoy utilizando el grupo de noticias de django-es, agradecerles su paciencia y ayuda, durante años he utilizado frecuentemente foros y grupos de noticias es por eso que en varias ocasiones he leído How To Ask Questions The Smart Way que habla sobre como preguntar correctamente en estos medios.

El articulo comenta que antes de hacer una pregunta técnica, en grupos, foros, IRC, etc.. deberías hacer esto antes:
- Buscar la respuesta en el manual.
- Buscar la respuesta en el FAQs.
- Buscar en Internet.

¿Porque esto antes?, principalmente porque encontraras la respuesta antes, si es muy probable que entre que redactas la pregunta, entienden lo que preguntas, y responden, pasa un tiempo precioso que tu has estado revisando el sitio donde has consultado a ver si te contestan. Ademas de que evitaras flames con usuarios que están cansados de contestar preguntas que se responden solas en las 10 primeros links de una consulta al buscador que utilices.

Si haces una pregunta, y has seguido lo anterior, demostraras que has hecho los deberes, e incluso mostraran más interés en responderte porque los que responden habitualmente se sentirán identificados contigo, darás la sensación de que no desperdicias el tiempo de los demás, ademas si aportas en tu consulta lo que has aprendido mejor que mejor sera mas enriquecedor.

Prepara la pregunta, no te precipites, si quieres una respuesta rentable, se rentable en tu pregunta, no tienes derecho a que te respondan tenlo en cuenta quien lo haga te esta haciendo un favor, agradecelo, no sientas que es obligado que respondan.

Cuando preguntes elige donde preguntas con cuidado, que sea el foro de la temática adecuada, que el nivel sea el adecuado, etc..

Se claro y cuida la ortografía y la gramática, NO ESCRIBAS EN MAYÚSCULAS.

El formato de la pregunta tiene que ser claro, utiliza texto plano, utiliza párrafos.

Utiliza el titulo, asunto de manera inteligente, no pongas cosas como "Alguien me ayuda!!!"

Intenta ser preciso sobre tu problema.

Describe el problema, no tus suposiciones, de manera cronológica.

La Cortesía y educación ayudan

Añade la etiqueta [SOLUCIONADO] al asunto del mail, foro etc. haciendo un pequeño resumen de como lo hiciste.

Recordar que esto es un pequeño resumen de la traducción de Jose M. Fernández

Mis experiencias con Django

Queda inaugurada la sección de experiencias con Django, ale a chafardear un poco la pagina donde iré agregando artículos sobre django...

« Previous PageNext Page »