Relaciones en modelos de datos con Django

February 20, 08 by Tomcask

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.




This entry no have comments... but you can be first.

Leave a Reply