Как создать слизня unique_for_field в Django? - PullRequest
6 голосов
/ 01 февраля 2010

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

Мои идеи пока:

  • Добавьте в таблицу уникальный индекс для слаг и categoryid. Для этого требуется код вне Django. И будет ли встроенный администратор обрабатывать это правильно, когда вставка / обновление завершится неудачно?

  • Переопределите сохранение для модели и добавьте мою собственную проверку, выдавая ошибку, если дубликат существует. Я знаю, что это будет работать, но это не выглядит очень СУХОЙ.

  • Создайте новое поле слагов, унаследованное от базы, и добавьте туда функциональность unique_for. Это кажется лучшим способом, но я просмотрел код ядра unique_for_date, и он не казался очень интуитивным расширить его.

Есть идеи, предложения или мнения о том, как лучше всего это сделать?

1 Ответ

14 голосов
/ 01 февраля 2010

А как насчет 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;) Или я упустил момент?

...