首页 > 解决方案 > 将模型的记录配置为唯一不重复

问题描述

我有一个标签模型,它与具有多对多关系的文章相关:

class Tag(models.Model):
    owner = models.ForeignKey(User,on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    def __str__(self):
        return self.name
    class Meta:
        ordering = ("id",)

class Article(models.Model):
    tags = models.ManyToManyField(Tag, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    ...

我想确保标签是唯一的而不是重复的,但发现这很困难

In [39]: article.tags.create(name="django", owner=article.owner)
Out[39]: <Tag: django>
In [40]: article.tags.create(name="django", owner=article.owner)
Out[40]: <Tag: django>
In [41]: article.tags.create(name="django", owner=article.owner)
Out[41]: <Tag: django>
In [42]: article.tags.all()
Out[42]: <QuerySet [<Tag: django>, <Tag: django>, <Tag: django>, <Tag: django>, <Tag: django>]>
In [43]: Tag.objects.all()
Out[43]: <QuerySet [<Tag: django>, <Tag: django>, <Tag: django>, <Tag: django>, <Tag: django>, '...(remaining elements truncated)...']>

如何将标签的重新编码配置为唯一?

标签: django

解决方案


可以通过添加到您的字段定义在字段级别指定唯一性unique=True,例如:

name = models.CharField(max_length=50, unique=True)

或在模型级别使用Meta属性unique_together对多个字段进行约束,例如:

class Meta:
    ordering = ("id",)
    unique_together = ("name", "owner")

推荐阅读