【问题标题】:How to create an UniqueConstraint for M2M relationship table in Django ORM?如何在 Django ORM 中为 M2M 关系表创建 UniqueConstraint?
【发布时间】: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 主键字段?

【问题讨论】:

    标签: python django orm


    【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多