django - 姜戈。通过模型与手动中间模型的 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)
我发现的主要优点是可以在管理页面创建一个内联表单集,并且序列化程序可能更容易;但正如我所见,从技术上讲,这两个选项是相同的。
解决方案
另一个优点是您在Group
.
您可以通过执行以下操作从组中检索所有成员:
group.members.all()
代替 :
Person.objects.filter(membership__group=group)
推荐阅读
- xml - Vuex 从 xml 获取数据
- flutter - Flutter Provider:notifyListeners() 在异步函数中不起作用
- java - 为什么 Java String "a".getBytes("UTF-16") 得到结果 [-2,-1,0,97]?
- bing - 有没有办法从明天获取 Bing 壁纸图像?
- php - 数组无法传递给刀片。我应该怎么办?
- javascript - 我可以在js文件中使用打字稿吗
- java - 无法在 Docker 的 selenium 项目中开始测试
- html - 带有 CSS 的外部 HTML 文件作为带有 Styliner 的 nodemailer 中的电子邮件内容
- azure-storage - 如何删除 Azure Blob 存储中未提交的块?
- java - 没有外部依赖的Java序列化?