django - 如何使模型字段值唯一(唯一 = True),但仅将其与该用户的其他模型进行比较?
问题描述
我有一个标签模型,它必须有一个必须唯一的名称字段,但仅适用于该用户的标签。
这样一个用户就不能创建两个“tagname”标签,但许多不同的用户可以(创建一个具有相同名称的标签)。
该字段在与用户相关的模型中必须是唯一的。
这是模型。
class User(AbstractUser):
email = models.EmailField(unique=True)
class Tag(models.Model):
name = models.CharField(max_length=30, unique=True)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE,
related_name='tags')
解决方案
如果您使用的是 Django 2.1 或更早版本,则可以unique_together
这样使用:
class Tag(models.Model):
name = models.CharField(max_length=30, unique=True)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='tags')
class Meta:
unique_together = ['name', 'user']
如果您使用的是 Django 2.2,则可以使用UniqueConstraint
而不是unique_together
这样:
class Tag(models.Model):
name = models.CharField(max_length=30, unique=True)
user = models.ForeignKey(User, null=True, on_delete=models.CASCADE, related_name='tags')
class Meta:
constraints = [
models.UniqueConstraint(fields=['name', 'user'], name='give_it_some_name')
]
正如文档所述:
将 UniqueConstraint 与约束选项一起使用。
UniqueConstraint 提供了比 unique_together 更多的功能。unique_together 将来可能会被弃用。
推荐阅读
- sql - 在 excel 数据集中什么被认为是足够的验证
- angular - Swagger-codegen 不将枚举生成为枚举类型
- javascript - 将鼠标悬停在文本上以显示其他文本
- kotlin - 将 LinkedHasSet 从一种类型转换为另一种
- javascript - 在不更改 DOM 元素的情况下,获取 Html 代码、替换部件并以字符串形式存储在变量中
- python - 在 python 中循环遍历列表的一部分时,我无法正确索引
- reactjs - React:如果子组件不返回null,则将其包装在div中
- freertos - FreeRTOS Mutex 意外行为
- ruby-on-rails - 验证阻止使用嵌套属性创建记录
- javascript - Identity Server 登录页面在哪里以及如何自定义?