2010-01-31 2 views
6

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

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) 

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

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

Мои идеи до сих пор:

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

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

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

Любые идеи, предложения или предложения по наилучшему способу сделать это?

ответ

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',) 

Это создает индекс, но не вне Джанго;) Или я пропустил точку?

+0

Конечно, это так просто. Спасибо за помощь и обновление ответа! –