нормально ли создавать множество объектов без сквозного поля?

#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.