Estoy definiendo mis modelos de Django en este momento y me di cuenta de que no había un OneToManyField
tipo de campo en el modelo. Estoy seguro de que hay una manera de hacer esto, así que no estoy seguro de lo que me estoy perdiendo. Básicamente tengo algo como esto:
class Dude(models.Model):
numbers = models.OneToManyField('PhoneNumber')
class PhoneNumber(models.Model):
number = models.CharField()
En este caso, cada uno Dude
puede tener múltiples PhoneNumber
s, pero la relación debe ser unidireccional, en la que no necesito saber desde el PhoneNumber
cual Dude
lo posee, por sí mismo, ya que podría tener muchos objetos diferentes que los propios PhoneNumber
casos, como una Business
de ejemplo:
class Business(models.Model):
numbers = models.OneToManyField('PhoneNumber')
¿Con qué reemplazaría OneToManyField
(que no existe) en el modelo para representar este tipo de relación? Vengo de Hibernate / JPA donde declarar una relación de uno a muchos fue tan fácil como:
@OneToMany
private List<PhoneNumber> phoneNumbers;
¿Cómo puedo expresar esto en Django?
fuente
dude = models.ForeignKey(Dude, related_name='numbers')
y luego puede usarsome_dude_object.numbers.all()
para obtener todos los números relacionados (si no especifica un "nombre_definido", el valor predeterminado será "número_conjunto").En Django, una relación de uno a muchos se llama ForeignKey. Sin embargo, solo funciona en una dirección, por lo que, en lugar de tener un
number
atributo de claseDude
, necesitaráMuchos modelos pueden tener
ForeignKey
uno a otro modelo, por lo que sería válido tener un segundo atributo dePhoneNumber
tal manera quePuede acceder a la
PhoneNumber
s para unDude
objetod
cond.phonenumber_set.objects.all()
, y luego hacer lo mismo para unBusiness
objeto.fuente
ForeignKey
significaba "uno a uno". Usando su ejemplo anterior, debería tener unDude
que tiene muchosPhoneNumbers
¿verdad?ForeignKey
es solo uno a uno si lo especificaForeignKey(Dude, unique=True)
, por lo que con el código anterior obtendrá unDude
con múltiplesPhoneNumber
s.PhoneNumber
. Ahora está empezando a tener sentido.ForeignKey
es esencialmente muchos a uno, por lo que debe hacerlo al revés para obtener uno a muchos :)phonenumber_set
? No lo veo definido en ningún lado. ¿Es el nombre del modelo, en minúsculas, junto con "_set"?Para ser más claro, no hay OneToMany en Django, solo ManyToOne, que es Foreignkey descrito anteriormente. Puede describir la relación de OneToMany usando Foreignkey, pero eso es muy poco interesante.
Un buen artículo al respecto: https://amir.rachum.com/blog/2013/06/15/a-case-for-a-onetomany-relationship-in-django/
fuente
Puede usar una clave externa en muchos lados de la
OneToMany
relación (es decir,ManyToOne
relación) o usarManyToMany
(en cualquier lado) con una restricción única.fuente
django
es lo suficientemente inteligente En realidad no necesitamos definir eloneToMany
campo. Será generado automáticamente pordjango
usted :-). Solo necesitamos definirforeignKey
en la tabla relacionada. En otras palabras, solo necesitamos definir laManyToOne
relación mediante el usoforeignKey
.si queremos obtener la lista de ruedas de un automóvil en particular. Utilizaremos el
python's
objeto generado automáticamentewheel_set
. Para el autoc
usarásc.wheel_set.all()
fuente
Si bien la respuesta de Rolling Stone es buena, directa y funcional, creo que hay dos cosas que no resuelve.
Presente el marco de tipos de contenido , que expone algunos objetos que nos permiten crear una "clave externa genérica" en el modelo PhoneNumber. Entonces, podemos definir la relación inversa en Dude y Business
Consulte los documentos para obtener más información, y quizás consulte este artículo. para obtener un tutorial rápido.
Además, aquí hay un artículo que argumenta en contra del uso de FK genéricos.
fuente
Si el modelo "muchos" no justifica la creación de un modelo per se (no es el caso aquí, pero podría beneficiar a otras personas), otra alternativa sería confiar en tipos de datos específicos de PostgreSQL, a través del paquete Django Contrib
Postgres pueden hacer frente a la matriz o JSON tipos de datos, y esto puede ser una buena solución para manejar Uno-A-Muchos, cuando los muchos-s sólo pueden estar vinculados a una única entidad del uno .
Postgres le permite acceder a elementos individuales de la matriz, lo que significa que las consultas pueden ser realmente rápidas y evitar gastos generales a nivel de aplicación. Y, por supuesto, Django implementa una API genial para aprovechar esta característica.
Obviamente tiene la desventaja de no ser portátil para el backend de la base de datos de otros, pero creo que aún vale la pena mencionarlo.
Espero que pueda ayudar a algunas personas que buscan ideas.
fuente
Antes que nada hacemos un recorrido:
01) relación uno a muchos:
NB: Django no proporciona ninguna relación OneToMany. Entonces no podemos usar el método superior en Django. Pero necesitamos convertir en modelo relacional. Entonces, ¿qué podemos hacer? En esta situación, necesitamos convertir el modelo relacional en un modelo relacional inverso.
Aquí:
modelo relacional = OneToMany
Entonces, modelo relacional inverso = ManyToOne
NB: Django admite la relación ManyToOne y en Django ManyToOne está representado por ForeignKey.
02) relación de muchos a uno:
NB: ¡PIENSE SIMPLEMENTE!
fuente