proyectos - Campos de acceso en el modelo intermedio de Django.
onetoonefield django (2)
Estoy creando un grupo de personas y una membresía como se describe en los documentos de Django para el modelo intermedio.
class Person(models.Model):
name = models.CharField(max_length=128)
def __unicode__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through=''Membership'')
def __unicode__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Es posible acceder a la persona desde un objeto de grupo con:
>>>Group.members.name
¿Django crea otra consulta para buscar a la Persona? ¿Puedo acceder al campo date_joined
desde un objeto de grupo?
Lo que me confunde es que esperaría obtener el campo Nombre de la persona con:
>>>Group.members.person.name
¿Qué sucede si una persona tiene un campo ''nombre'' y también el modelo intermedio tiene un campo ''nombre''?
El campo de miembros en su ejemplo es un campo ManyToManyField, por lo que es una forma de acceder a muchas personas en lugar de una sola persona. El objeto que está debajo del campo de miembros es en realidad un tipo especial de Administrador, no una Persona:
>>>print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
Para entender mejor lo que es un administrador, consulte la documentación .
Para acceder al nombre de una persona harías, por ejemplo:
>>>for person in my_group.members.all():
>>> print person.name
No puede acceder a los campos en su modelo de Membresía a través del Administrador en el campo de miembros. Para acceder a cualquiera de los campos en él harías:
>>>for membership in my_group.membership_set.all():
>>> print membership.date_joined
Y así, si tuviera un campo llamado nombre en su modelo de Membresía, podría acceder a él de esta manera:
>>>for membership in my_group.membership_set.all():
>>> print membership.name
Una segunda forma de acceder al nombre de una persona sería:
>>>for membership in my_group.membership_set.all():
>>> print membership.person.name
Espero que esto ayude un poco :)
Utilice el administrador de la clase de membresía:
MyGroup.membership_set.all()
en lugar de:
MyGroup.members.all()