Django Models如何添加唯一约束

Posted

技术标签:

【中文标题】Django Models如何添加唯一约束【英文标题】:Django Models how to add unique constraint 【发布时间】:2021-04-01 22:27:42 【问题描述】:

与 this 的情况不同,我试图只允许一个用户在数据库中输入一个条目:

class Station(models.Model):
    serial = models.CharField("serial", max_length = 31, unique = True)
    user = models.ForeignKey(User, on_delete = models.CASCADE, )

我想要的是一个用户只能有零个或一个站(串行)。

【问题讨论】:

【参考方案1】:

这可以使用one-to-one relationship 来实现。这意味着用户可以拥有零个或恰好一个站点。

class Station(models.Model):
    serial = models.CharField("serial", max_length = 31, unique = True)
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
    )

【讨论】:

我可以编辑用户在尝试添加第二个序列时看到的消息吗? 我认为这取决于您的用例。您使用的是模型表单、Django Rest 框架还是其他? 我更多地考虑了 admin tbh。【参考方案2】:

您可以在 ForeignKey 上设置unique=true, 但你确实有错误的关系类型,因为你应该有One-to-one

一对一的关系。从概念上讲,这类似于 具有 unique=True 的 ForeignKey,但关系的“反向”端 将直接返回单个对象。

class Station(models.Model):
    serial = models.CharField("serial", max_length=31, unique=True)
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        null=True,
        blank=True
    )

【讨论】:

以上是关于Django Models如何添加唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

Django model中设置多个字段联合唯一约束

django:IntegrityError:重复键值违反唯一约束

Django model中设置多个字段联合唯一约束

Django:删除唯一约束并创建迁移

你能在 Sqlite3(使用 Django)中实现不区分大小写的“唯一”约束吗?

IntegrityError:重复键值违反唯一约束