Можно ли создать ManyToMany без сквозного поля?
так в документации Django models, когда мне нужно добавить дополнительные данные к полям ManytoMany, документация django рекомендует использовать 'through', как в этом примере
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
def __str__(self):
return self.name
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)
В панели администратора это хорошо, но когда я пытаюсь использовать это в views.py для создания API, я получаю много проблем, что я не могу получить информацию о полях Membership из модели Group
но когда я создал такую модель, это стало возможным:
class Person(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField('Membership')
def __str__(self):
return self.name
class Membership(models.Model):
person = models.ForeignKey(Person, on_delete=models.CASCADE)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
не следовать документации заставляет меня чувствовать, что я делаю это неправильно
поскольку я новичок, я не знаю, хорошо ли то, что я сделал, или нет? например, плохо ли создавать такую модель? если я должен вернуться к использованию 'through', есть ли возможный способ получить поля Membership из модели Group?
Даже если вы опустите аргумент through
для M2M filed, Django все равно создаст третью таблицу для хранения отношений между конкретными Person
и Group
записями. Смотрите docs для объяснения.
поскольку я новичок, я не знаю, хорошо ли то, что я сделал, или нет? например, плохо ли создавать такую модель?
Это не хорошо и не плохо, а зависит только от ваших требований. Если вам не нужна дополнительная информация для членства - вы можете не создавать промежуточную таблицу (модель) своими силами и оставить это на усмотрение Django, чтобы эта таблица была создана за сценой, но в случае, если вам нужны дополнительные поля членства:
есть ли возможность получить поля Membership из модели Group
, вы должны самостоятельно создать промежуточную таблицу с нужными полями
Вы также можете прочитать эту статью, чтобы иметь лучшее представление об использовании M2M.