Понимание множества полей в Джанго с помощью сквозной модели


У меня возникли проблемы с пониманием использования множества моделей полей со сквозной моделью. Я могу легко достичь того же самого без поля ManyToMany. Учитывая следующее Из документов Django:

class Person(models.Model):
    name = models.CharField(max_length=128)


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

Чего я не понимаю, так это как использовать поле ManyToMany лучше, чем просто отбросить его и использовать соответствующий менеджер. Например, две модели изменятся на следующие:

class Group(models.Model):
    name = models.CharField(max_length=128)


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='members')
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

Чего мне здесь не хватает?

1 4

1 ответ:

Да, использование явной таблицы through в принципе устраняет необходимость в ManyToManyField.

Единственное реальное преимущество в том, чтобы иметь его, если вы найдете соответствующего менеджера удобным. То есть вот это:

group.members.all()  # Persons in the group

Выглядит лучше, чем это:

Person.objects.filter(membership_set__group=group)  # Persons in the group
На практике я думаю, что основная причина наличия обоих заключается в том, что часто люди начинают с простого ManyToManyField; понимают, что им нужны дополнительные данные и добавляют таблицу through; а затем заканчивают тем и другим из-за кода, который использует оба менеджера.