如何在 Django ORM 中为 M2M 关系表创建 UniqueConstraint?

Posted

技术标签:

【中文标题】如何在 Django ORM 中为 M2M 关系表创建 UniqueConstraint?【英文标题】:How to create an UniqueConstraint for M2M relationship table in Django ORM? 【发布时间】:2020-07-14 16:18:42 【问题描述】:
class MyChoices(models.IntegerChoices):
    CHOICE_A = 1
    CHOICE_B = 2


class MyModelA(models.Model):
    choice = models.IntegerField(choices=MyChoices.choices)
    payload = models.CharField(...)


class MyModelB(models.Model):
    models_a = models.ManyToManyRelationshipField(MyModelA, ...)
    payload = models.CharField(...)

有没有办法可以在app_my_model_b_my_model_a 表上创建一个UniqueConstraint 并带有MyModelA.choice 字段和MyModelB 主键字段?

【问题讨论】:

【参考方案1】:

您可以将模型定义为through=… model [Django-doc]:

class MyChoices(models.IntegerChoices):
    CHOICE_A = 1
    CHOICE_B = 2


class MyModelA(models.Model):
    choice = models.IntegerField(choices=MyChoices.choices)


class MyModelB(models.Model):
    models_a = models.ManyToManyRelationshipField(MyModelA, through='MyModelC')

class MyModelC(models.Model):
    model_a = models.ForeignKey(MyModelA, on_delete=models.CASCADE)
    model_b = models.ForeignKey(MyModelB, on_delete=models.CASCADE)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['model_a', 'model_b'], name='unique_a_b')
        ]

【讨论】:

我的意思打错了,抱歉,我需要为一个模型字段和另一个模型 ID 创建一个 UniqueConstraint @khjfpggkfmkqqucifw:不,这是不可能的,您通常应该以不同的方式建模,例如在 m2m 模型中编码 payload

以上是关于如何在 Django ORM 中为 M2M 关系表创建 UniqueConstraint?的主要内容,如果未能解决你的问题,请参考以下文章

通过 m2m 关系的直通表的值过滤 django 查询集

Python 什么是ORM?

django ORM - 在 M2M 上排除 F 功能不起作用

如何根据 M2M 关系在 django 模型中自动填充 IntegerField?

更新 Django 中现有的 M2M 关系

Django m2m 表单保存“通过”表