Понимание множества полей в Джанго с помощью сквозной модели
У меня возникли проблемы с пониманием использования множества моделей полей со сквозной моделью. Я могу легко достичь того же самого без поля 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 ответ:
Да, использование явной таблицы
through
в принципе устраняет необходимость вManyToManyField
.Единственное реальное преимущество в том, чтобы иметь его, если вы найдете соответствующего менеджера удобным. То есть вот это:
group.members.all() # Persons in the group
Выглядит лучше, чем это:
На практике я думаю, что основная причина наличия обоих заключается в том, что часто люди начинают с простогоPerson.objects.filter(membership_set__group=group) # Persons in the group
ManyToManyField
; понимают, что им нужны дополнительные данные и добавляют таблицуthrough
; а затем заканчивают тем и другим из-за кода, который использует оба менеджера.