Как создать уникальный для поля слизняк в Django?

Джанго есть unique_for_date свойства можно задать при добавлении SlugField к вашей модели. Это приводит к тому, что пуля уникальна только для даты указанного поля:

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

каков был бы лучший способ достичь такой же функциональности для поля не-DateTime, как ForeignKey? В идеале, я хочу сделать что-то вроде этого:

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

таким образом, я мог бы создать следующие URL-адреса:

/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;)или я упустил суть?