Доступ к полю набора «многие ко многим» в отношении django

У меня есть набор моделей, похожий на приведенный ниже, где человек может быть членом многих клубов, но иметь различный тип членства. В данном случае я считаю Membership слабой сущностью Club

class Person(models.Model):
    name = models.TextField()

class Club(models.Model):
    members = models.ManyToManyField(
            Person,
            related_name="clubs"
            through='Membership'
            )

class Membership(models.Model):
    person = models.ForeignKey(Person)
    club = models.ForeignKey(Club)
    member_type = models.TextField()

Я знаю, что могу получить доступ к информации о членстве в клубе, выполнив следующие действия:

instance_of_club.membership_set.all()

И я могу получить список всех людей, используя это:

instance_of_club.membership_set

Тем не менее, я пытаюсь написать сериализатор для такого сценария, и у меня возникают проблемы с правильным поиском деталей «членства» из класса django Meta.

Club._meta.many_to_many дает поле members:

<django.db.models.fields.related.ManyToManyField: members>

Но ничто в members не указывает, как получить аксессор _set, и мне нужно иметь возможность получить его программно. Я хочу иметь возможность получить список всех отношений ManyToMany through, а затем получить объекты, которые они содержат, а не только внешние объекты.

Для контекста:

  • members.related.through дает класс Membership, но не набор экземпляров
  • members.related.related_name ничего не дает
  • Club._meta.get_all_field_names() дает membership в списке, но не membership_set

Как я могу получить список объектов отношения through в поле ManyToMany?


person Community    schedule 21.11.2016    source источник
comment
Насколько я понимаю, сквозная модель в этом случае through='Person' должна быть through='Membership'?   -  person AKS    schedule 21.11.2016
comment
Да, спасибо :) Это была ошибка в транскрипции.   -  person    schedule 21.11.2016
comment
Почему отношения m2m относятся к модели Member, а таблица Membership имеет внешний ключ к модели Person? Как связаны модели Member и Person?   -  person AKS    schedule 21.11.2016


Ответы (1)


Ваша модель Club, вероятно, должна выглядеть так:

class Club(models.Model):
    members = models.ManyToManyField(
        Person, related_name='clubs', through='Membership'
    )

Я знаю, что могу получить доступ к информации о членстве в клубе, выполнив следующие действия:

instance_of_club.membership_set.all()

И я могу получить список всех людей, используя это:

instance_of_club.membership_set

Это неправда! instance_of_club.membership_set — менеджер клуба по модели Membership. instance_of_club.membership_set.all() это QuerySet связанного менеджера (тоже Membership экземпляров модели):

club_instance.members.all()  # all related Person instances of a club
club_instance.membership_set.all()  # all related Memberships of a club
person_instance.clubs.all()  # all related Club instances of a person
person_instance.membership_set.all()  # all related Memberships of a person
person schwobaseggl    schedule 21.11.2016
comment
Я знаю, что могу получить сквозную модель, мне это не нужно. Мне нужно поле исходного объекта. - person ; 21.11.2016
comment
club_instance.members.all() просто вернет список людей, а не объектов членства - person ; 21.11.2016
comment
В чем тогда проблема? Вы упоминаете club_instance.membership_set.all(), который дает вам QuerySet сквозных экземпляров - person schwobaseggl; 21.11.2016
comment
@LegoStormtroopr Обновил мой ответ, чтобы сделать его более понятным. - person schwobaseggl; 21.11.2016
comment
Этот сериализатор работает в нескольких различных моделях. Мне нужно иметь возможность получить многие ко многим через отношения аналогично доступу к fiels.many_to_many - person ; 21.11.2016