Estoy trabajando en un proyecto de Django e intento crear algunos modelos vinculados para mis datos que, según creo, funcionan, pero parece que no puedo averiguar cómo acceder a los datos vinculados.
class One(models.Model) name = models.CharField(max_length=50) list = models.ArrayField(models.CharField(max_length=50), blank=True) def __str__(self): return self.name class Many(models.Model) name = models.CharField(max_length=50) related = models.ForeignKey(One, null=True, blank=True) def __str__(self): return self.nameEsta es la relación general que he establecido.
Lo que estoy tratando de hacer es, en una plantilla, tener acceso a una lista de todos los 'Unos', y a través de cada uno de ellos, puedo acceder a cada Muchos y sus atributos relacionados. Puedo ver cómo acceder a los atributos para un solo 'Uno', pero no cómo pasarlos todos y sus modelos 'Muchos' relacionados y los atributos relacionados para cada uno. Esencialmente, la salida que me gustaría tendría una lista desplegable con One's, y cuando se envíe, algunos Javascript usarán la lista en el modelo 'Muchos' para hacer algunas cosas.
Cualquier consejo sería muy apreciado.
Si ya tiene los objetos de One clase de modelo, puede acceder a many objetos usando many_set (consulte: relaciones hacia atrás ):
{% for one_obj in one_objs %} {% for m_obj in one_obj.many_set.all %} # do stuff with m_obj here {% endfor %} {% endfor %} Una cosa importante a tener en cuenta aquí es que esto ejecutará una consulta de base de datos para cada m_obj . Para hacer que esto sea eficiente, puede precargar many_set con one_objs en su vista.
En su opinión, use prefetch_related :
one_objs = One.objects.all().prefetch_related('many_set')Se puede acceder a las búsquedas inversas a través del atributo ___set de un objeto. Entonces, para obtener todos los objetos "Muchos" para un "Uno" dado, podría hacer one.many_set
Django búsqueda inversa de claves foráneas
Con respecto al uso en una plantilla, se puede acceder a los conjuntos agregando "todos" (dado que el conjunto devuelve un conjunto de consulta, puede ejecutar consultas en él, incluso en la plantilla)
Acceda a ForeignKey establecido directamente en la plantilla en Django
Consulte la sección correspondiente de la documentación de Django: https://docs.djangoproject.com/en/dev/topics/db/queries/#following-relationships-backward
Puede usar " prefetch_related " de Django y " related_name " de Django.
Además, esta pregunta ha sido respondida aquí .
Sin embargo, esto es lo que podría querer, primero, cambie su definición de clave externa a esto:
related = models.ForeignKey(One, null=True, blank=True, related_name='relateds')Luego puede recuperar las claves foráneas:
one = One.objects.get(name="TheOneYouWant").prefetch_related('relateds') manys = one.relateds