#python #django #django-models #django-rest-framework
Вопрос:
поэтому в документации по моделям Django, когда мне нужно добавить дополнительные данные во множество полей, документация django рекомендует использовать «сквозные», как в этом примере
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 у меня возникает много проблем, из-за которых я не могу получить информацию о полях членства из модели группы
но когда я создал подобную модель, это стало возможным:
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)
не следование документам заставляет меня чувствовать, что я делаю это неправильно
так как я новичок, я не знаю, хорошо ли то, как я поступил, или нет? например, плохо ли создавать такую модель? если мне следует вернуться к использованию «через», то есть ли возможный способ получить поля членства из групповой модели?
Комментарии:
1. Ваш первый фрагмент создает 3 таблицы в базе данных, второй фрагмент, с другой стороны, создает 4 таблицы (здесь одна из таблиц действительно избыточна). Это усложняет ваши запросы, потенциально увеличивает работу администратора БД и т.д. Если ваш вопрос звучит так: » Получите поля членства из модели группы? «почему бы тебе просто не спросить об этом ? (И дайте для этого более подробную информацию, не совсем понятно, что вы там имеете в виду)
2. о, я не знал, что он создает больше таблиц без использования «сквозного» спасибо за эту информацию, дело в моем views.py когда я пишу «Group.objects.all ()», я получаю только идентификатор и имя для полей группы , но я не получаю поле «участники», например (имя__человека, приглашение, дата). я попытался выполнить фильтрацию и предварительную выборку, но я все еще не получаю результат
3.
members
будет связанным менеджером, который будет предоставлять связанныеPerson
экземпляры при запросе. Если вы хотитеMembership
, чтобы экземпляры, которые вы хотите записатьgroup.membership_set.all()
,membership_set
были сгенерированы по умолчаниюrelated_name
.
Ответ №1:
Даже если вы опустите through
аргумент для M2M-файла, Django все равно создаст третью таблицу для хранения отношений между конкретными Person
записями и Group
записями. См. Документы для объяснения.
так как я новичок, я не знаю, хорошо ли то, как я поступил, или нет? например, плохо ли создавать такую модель?
Это не хорошо или плохо, но зависит только от ваших требований. Если вам не нужна дополнительная информация для членства — вы можете избежать создания промежуточной таблицы (модели) самостоятельно и оставить ее на усмотрение Django, чтобы эта таблица создавалась за кулисами, но в случае, если вам нужны дополнительные поля членства:
есть ли возможный способ получить поля членства из модели группы
, вы должны самостоятельно создать промежуточную таблицу с необходимыми полями
Вы также можете прочитать эту статью, чтобы лучше понять использование M2M.