首页 > 解决方案 > Django slugs 不是唯一的 unique=True

问题描述

我创建了两篇标题为“测试”的文章,这是第二篇生成的错误:

duplicate key value violates unique constraint "xxx_content_slug_xxxx_uniq"
DETAIL:  Key (slug)=(test) already exists.

知道这是我的模型:

class Content()
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.title)
        super(Content, self).save(*args, **kwargs)

并且知道我在数据库中进行了迁移。

我不知道如何解决。

注意:问题是由继承内容类的类帖子产生的,我认为这些信息在这种情况下没有帮助。

标签: django

解决方案


slugify不检查唯一性,因此如果您创建两篇具有相同标题的文章,slugify(self.title)将生成两次相同的 slug,这当然会导致数据库抱怨违反唯一性约束。

在字段上设置unique = True,不会自动为每个新实例创建唯一值,它只会在数据库上创建一个约束,相同的值不能被保存两次。

您可以使用django-autoslug,这是一个完全满足您需要的库。

只需安装软件包,然后像这样实现您的字段:

from django.db.models import CharField, Model
from autoslug import AutoSlugField

class Content(models.Model)
    title = CharField(max_length=200)
    slug = AutoSlugField(populate_from='title')

AutoSlugField执行以下操作:

  1. 从另一个领域填充自己,
  2. 保持价值的唯一性和
  3. 使用自定义 slugify() 函数以获得更好的 i18n。

(另外,我假设它Content是 的子类Model,否则您的代码将根本无法工作。)


推荐阅读