如何使“模型”字段值唯一(唯一= True),但仅将其与该用户的其他模型进行比较?

时间:2019-07-14 23:28:38

标签: django django-models

我有一个标记模型,该模型必须具有一个唯一的名称字段,但只能用于该用户的标记。

这样一个用户不能创建两个“ 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')

1 个答案:

答案 0 :(得分:0)

如果您使用的是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')
    ]

作为docs状态:

  

改为将UniqueConstraint与constraints选项一起使用。

     

UniqueConstraint提供的功能比unique_together还要多。将来可能不推荐使用unique_together。