如何在Django中创建unique_for_field slug?

时间:2010-01-31 21:32:27

标签: django django-models slug

Django在向模型添加SlugField时可以设置unique_for_date属性。这会导致slug仅对您指定的字段的日期唯一:

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之外的代码。当插入/更新失败时,内置管理员会正确处理吗?

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

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

有关最佳方法的任何想法,建议或意见吗?

1 个答案:

答案 0 :(得分:14)

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之外;)或者我是否错过了这一点?