我很难理解许多模型字段与直通模型的用法.没有太多的领域,我也能轻松实现同样的目标.从Django的文件中可以看出:

class Person(models.Model):
    name = models.CharField(max_length=128)


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')


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)

我不明白的是,如何使用ManyToMany字段比简单地删除它并使用相关管理器更好.例如,这两个型号将更改为:

class Group(models.Model):
    name = models.CharField(max_length=128)


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE, related_name='members')
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

我错过了什么吗?

推荐答案

您说得对,如果您明确定义了membership表,那么您就不需要使用ManyToManyField.

拥有它的唯一真正好处是如果你觉得相关的经理方便的话.也就是说,这是:

group.members.all()  # Persons in the group

看起来比这个好多了:

Person.objects.filter(membership_set__group=group)  # Persons in the group

在实践中,我认为两者兼有的主要原因是人们通常从一个普通的ManyToManyField开始;意识到他们需要一些额外的数据,并显式地添加表;然后继续使用现有的管理器,因为它很方便.

Django相关问答推荐

当前路径 **/POST 与其中任何一个都不匹配

Django ModelForm提交按钮不起作用

Django 有脚手架吗?

ModelForm 的 Django TextField max_length 验证

Django中基于令牌的身份验证

Django JSONField 过滤

Django Facebook Connect 应用推荐

如何从 django 自定义中间件类返回 rest_framework.response 对象?

Django - 如何在其管理模块中访问模型的详细名称?

Django:如何从模板调用视图函数?

URL命名空间的一个真实例子

Django:如何使用动态(非模型)数据预填充 FormView?

从表单获取模型实例而不保存

Django 什么是反向关系?

Django 应用程序中的版本号

如何重置 PostgreSQL 表上的 ID 序列

在 django admin 中链接到外键对象

AUTH_USER_MODEL 指的是尚未安装和创建的模型 .. AbstractUser 模型无法登录

运行单元测试时禁用 Django South?

如何更改 ModelForm 中所有 Django 日期字段的默认小部件?