如何在 Django 中创建 unique_for_field slug?

Posted

技术标签:

【中文标题】如何在 Django 中创建 unique_for_field slug?【英文标题】:How to create a unique_for_field slug in Django? 【发布时间】:2011-01-11 12:28:51 【问题描述】:

Django 有一个unique_for_date 属性,您可以在将 SlugField 添加到模型时设置。这会导致 slug 仅对于您指定的字段的 Date 是唯一的:

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(unique_for_date='publish')
    publish = models.DateTimeField()

为像 ForeignKey 这样的非 DateTime 字段实现相同功能的最佳方法是什么?理想情况下,我想做这样的事情:

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(unique_for='category')
    category = models.ForeignKey(Category)

这样我可以创建以下网址:

/example/category-one/slug
/example/category-two/slug
/example/category-two/slug <--Rejected as duplicate

到目前为止我的想法:

将 slug 和 categoryid 的唯一索引添加到表中。这需要 Django 之外的代码。当插入/更新失败时,内置管理员会正确处理这个问题吗?

覆盖模型的保存并添加我自己的验证,如果存在重复则抛出错误。我知道这可行,但它看起来不是很干。

创建一个从基础继承的新 slug 字段并在其中添加 unique_for 功能。 这似乎是最好的方法,但我查看了核心的 unique_for_date 代码,它看起来不是很直观地扩展它。

关于最佳方式的任何想法、建议或意见?

【问题讨论】:

【参考方案1】:

unique_together 呢?

class Example(models.Model):
    title = models.CharField()
    slug = models.SlugField(db_index=False)
    category = models.ForeignKey(Category)

    class Meta:
        unique_together = (('slug','category'),)
        # or also working since Django 1.0:
        # unique_together = ('slug','category',)

这会创建一个索引,但它不在 Django 之外;) 还是我没抓住重点?

【讨论】:

当然,就这么简单。感谢您的帮助和更新答案!

以上是关于如何在 Django 中创建 unique_for_field slug?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 中创建组权限

如何在 Django 中创建自定义 403 页面?

如何在 Django 模板中创建正确的路径

如何在 Django 中创建两种类型的用户?

如何在模型 Django 中创建密码字段

如何在 Django 迁移中创建 GIN 索引