Я создаю Группу Человека и Членство, как описано в документах Django для промежуточной модели.
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)
Возможно получить доступ к Человеку от объекта Группы с:
>>>Group.members.name
Django создает другой запрос для выборки Человека? Действительно ли я могу получить доступ date_joined
поле от объекта Группы?
Вещь, которая смущает меня, состоит в том, что я ожидал бы получать поле имени Человека с:
>>>Group.members.person.name
Что происходит, если у Человека есть поле 'имя', и также промежуточная модель имеет поле 'имя'.
Поле для членов в вашем примере является ManyToManyField, так что это способ получить доступ ко многим людям, а не к одному человеку. Объект, который находится под полем Members (члены), на самом деле является специальным типом Менеджера, а не Человека:
>>>print my_group.members
<django.db.models.fields.related.ManyRelatedManager object at 0x181f7d0>
Чтобы лучше понять, что такое Менеджер, смотрите документацию .
Чтобы получить доступ к имени человека, вы должны сделать, например:
>>>for person in my_group.members.all():
>>> print person.name
Вы не можете получить доступ к полям в вашей модели Membership (Членство) через Менеджер в поле Members (члены). Чтобы получить доступ к любому из полей в нем, Вы должны сделать это:
>>>for membership in my_group.membership_set.all():
>>> print membership.date_joined
И если бы у вас было поле с названием "Имя" в вашей модели членства, вы бы получили доступ к нему следующим образом:
>>>for membership in my_group.membership_set.all():
>>> print membership.name
Второй способ доступа к имени Человека был бы:
>>>for membership in my_group.membership_set.all():
>>> print membership.person.name
Надежда, которая немного помогает :)
.Используйте диспетчер класса членства:
MyGroup.membership_set.all()
вместо:
MyGroup.members.all()