首页 > 解决方案 > 如何使模型字段值唯一(唯一 = 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')

标签: djangodjango-models

解决方案


如果您使用的是 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 将来可能会被弃用。


推荐阅读