如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
django ORM - 在 M2M 上排除 F 功能不起作用