【问题标题】:Django model unique_together on primary key and unique constraints关于主键和唯一约束的 Django 模型 unique_together
【发布时间】:2017-12-08 20:13:37
【问题描述】:

我有一个下面给出的模型。

class mc(models.Model):
    ap=models.CharField(max_length=50,primary_key=True)
    de=models.CharField(max_length=50)
    STATUS=models.CharField(max_length=12,default='Y')
    class Meta:
        unique_together=(("ap","de"),)
        db_table='mc'

我已将 ap='1', de='2' 写入表 mc。

+----+----+--------+
| ap | de | STATUS |
+----+----+--------+
| 1  | 2  | Y      |
+----+----+--------+

然后我尝试写 ap='1' 和 de='3' 但它只是覆盖了前一个。现在表格包含

+----+----+--------+
| ap | de | STATUS |
+----+----+--------+
| 1  | 3  | Y      |
+----+----+--------+

然后我尝试编写 ap='2',de='3' 及其工作。由于我已经给出了 unique_together,所以 ap 和 de 的组合不起作用。

但如果我没有在 ap 或 de 上使用“primary_key”或“unique”约束,则 unique_together 可以工作。

你能帮帮我吗?如何在主键上使用 unique_together?

实际问题是,我有另一个类 mc1,它使用字段 ap 的外键。

class mc1(models.Model):                                                                                            

    test=models.ForeignKey(mc,on_delete=models.CASCADE,to_field='ap')

所以 mc.ap 应该是唯一的来定义外键。

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    Django 不支持多列主键。几年来一直是feature request。各型号must have one primary key.

    在您的情况下,如果 ap 是主键,那么 ap 中的每个值都必须是唯一的。不能同时存储(ap=1, de=2)(ap=1, de=3)

    也许您可以添加另一个字段作为主键。然后您将能够拥有unique_together('ap', 'de')

    【讨论】:

    • 是的,我也试过了。但我有另一个类 childmc,因为我有一个外键到 ap。当我进行迁移时,它会出现一些错误,说“ap 应该是唯一的”。
    • 我该如何克服这个问题?有什么方法可以通过使用信号来解决这个问题?
    • 您可以使用实际主键的外键,也可以使用两个整数字段来存储apde 值(但在这种情况下,您将失去约束检查)。我看不出信号对你有什么帮助。
    • 是否有任何第三方模块可以做到这一点
    • 我自己没用过。快速搜索即可找到django-composite-foreignkey。可能还有其他人。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 2010-11-03
    • 2013-10-20
    • 2022-01-10
    相关资源
    最近更新 更多