当我使用中间模型时,如何建立强制唯一性的多对多关系?

Posted

技术标签:

【中文标题】当我使用中间模型时,如何建立强制唯一性的多对多关系?【英文标题】:How to have a many to many relation that enforces uniqueness when I use an intermediate model? 【发布时间】:2013-01-23 02:27:23 【问题描述】:

我将中间模型用于“ManyToManyField using the through” 通常,如果我不使用中间字段,m2m 关系将是唯一的,并且不能有重复的数据。

在我使用中间模型之后。 m2m之间的关系可以有相同的数据。像这样

|    |    ['0'] (
|    |    |    addToProfile => Array (0)
|    |    |    (
|    |    |    )
|    |    |    endDate =  NULL
|    |    |    feedType =  "N"
|    |    |    id =  1
|    |    |    info =  "Big Kuy No Fear"
|    |    |    likeMaker => Array (3)
|    |    |    (
|    |    |    |    ['0'] =  "/api/v2/user/2/"
|    |    |    |    ['1'] =  "/api/v2/user/2/"
|    |    |    |    ['2'] =  "/api/v2/user/2/"
|    |    |    )
|    |    |    like_count =  "3"

我正在建立一个社交网络。所以这是我的提要对象,它有 3 个 like_counts 。但是这三个like来自同一个用户“/api/v2/user/2/”

我尝试在 m2m 字段中添加“unique=True”属性,但 django 出现错误,因为它最初没有授予将“unique”属性添加到 m2m 字段的权限。谁能帮帮我?

【问题讨论】:

试着澄清你想要什么,我无法通过阅读你的问题来理解它。 我想让 m2m 字段是唯一的,例如 a---x a---y a---z b---x b---x 看看这个:docs.djangoproject.com/en/dev/topics/db/examples/many_to_many @luistm 你现在明白我的问题了吗。 您看不到 django 文档的链接,是吗?为什么不创建自己的 m2m 表? 【参考方案1】:

尝试在中间模型中使用unique_together。

class M2MModel(models.Model):
    field1 = models.ForeignKey(Model1)
    field2 = models.ForeignKey(Model2)

    class Meta:
        unique_together = ('field1', 'field2')

【讨论】:

我有同样的问题,它也适用于我,因为我接受具有相同对 field1-field2 的多个中间对象,但我想要的是在 many2many 列表中只有一个实例跨度> 【参考方案2】:

unique_together 不适用于 M2M 关系。 More info.

【讨论】:

这张票是关于 ManyToManyFielda 的一部分 unique_together 约束,这与在 through 表上具有 unique_together 约束完全不同.不仅后者完全有可能,而且 Django 创建的隐式直通表也具有这种约束(您可以通过在一个这样的表上使用 \d+ (Postgres) 或 SHOW CREATE TABLE (mysql) 来查看)。【参考方案3】:

我刚刚完成了一个与您的要求非常相似的功能,但我的选择是使用另一个简单的模型作为中间模型。

这是我的代码。

class Vote(models.Model):
    class Meta:
        unique_together = ['content', 'by']

    content = models.ForeignKey(Content)
    by = models.ForeignKey(User)

就我而言,我认为实施 ManyToManyField 没有任何好处。

更新: 我刚刚从here 发现 Django 不会为 ManyToManyField 一起创建任何内置的唯一性。您必须实施自己的验证以使其独一无二。

【讨论】:

以上是关于当我使用中间模型时,如何建立强制唯一性的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

TP5的多对多模型,以及中间表,已经中间表的增删改查

如何首先在 EF 代码中建立模型和枚举之间的多对多关系?

Mybatis的多表(多对多)查询

使 ModelForm 与 Django 中的中间模型的多对多关系工作的步骤是啥?

通过联结表进行多对多自连接

Django - 使用表单集在不通过表的情况下建立 2 个模型之间的多对多关系