首页 > 解决方案 > 姜戈。通过模型与手动中间模型的 M2M 领域?

问题描述

通过模型使用多对多字段手动创建中间模型相比有什么优势?让我使用文档中的示例:

from django.db import models

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)

在我的例子中,在 Postgresql 中创建的表和 Django 中的管理页面将与使用以下命令创建的表相同:

from django.db import models

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)

我发现的主要优点是可以在管理页面创建一个内联表单集,并且序列化程序可能更容易;但正如我所见,从技术上讲,这两个选项是相同的。

标签: djangodjango-models

解决方案


另一个优点是您在Group.
您可以通过执行以下操作从组中检索所有成员:

group.members.all()

代替 :

Person.objects.filter(membership__group=group)

推荐阅读