tutorial proyectos onetoonefield fields example django model

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()