Поля доступа в промежуточной модели Django

Я создаю Группу Человека и Членство, как описано в документах 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

Что происходит, если у Человека есть поле 'имя', и также промежуточная модель имеет поле 'имя'.

19
задан odinho - Velmont 5 February 2015 в 21:24
поделиться

2 ответа

Поле для членов в вашем примере является 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

Надежда, которая немного помогает :)

.
33
ответ дан 30 November 2019 в 03:34
поделиться

Используйте диспетчер класса членства:

MyGroup.membership_set.all()

вместо:

MyGroup.members.all()
4
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: