2011-09-07 4 views
2

В моей модели:Django: более сложное ограничение уникальности?

class MyModel(models.Model): 
    active = models.BooleanField() 
    path = models.CharField(max_length = 512) 

Я хотел бы ограничить, что атрибут «путь» является уникальным среди тех случаев, когда активна ИСТИНА.

Кажется, что переопределение save() может не работать, как если бы два сейва выполнялись одновременно, оба могли пройти тест и продолжить и сохранить. Есть ли какой-то трюк или пользовательский SQL (я использую MySQL), который я мог бы использовать, чтобы иметь условное ограничение uniqness, подобное этому на уровне базы данных?

ответ

2

Что вы, вероятно, ищете, это проверка модели. Это было введено в 1.2 и достаточно хорошо документировано. Django Models Instances : Validating Objects

Несмотря на то, что вы можете написать какой-нибудь сложный SQL, чтобы сделать это, пока все строки базы данных созданы через ORM Django, тогда проверка модели является более удобным для обслуживания решением.

Кроме того: меня интересует, как вы это сделаете на уровне базы данных, за исключением некоторого уровня триггера предварительной фиксации. Единственность одного значения, зависящего от другого, являющегося истинным, - это то, что я не видел. Наличие единственного ограничения с двумя полями в активном + пути позволит 1 false, 1 true и любое количество активных строк NULL для заданного значения пути (при условии, что активный является нулевым, например, NullBooleanField).

+0

Хм, материал проверки кажется, что он эквивалентен переопределению save() (хотя и опережает при использовании форм). Однако обнуление поля вместо использования True/False - интересная идея. Думаю, у меня могло бы быть поле «неактивное», которое является True или None, а затем unique_together (path, inactive), да? – kdt

+0

Вы могли бы. Я не уверен, что django правильно применит ограничение unique_together - возможно, это так, но я хочу проверить. Единственные причины, которые я предлагал бы сделать против этого, это то, что я немного пуританский о значениях NULL и как они семантически означают что-то другое для False. О, и администратор django, кажется, отклоняет значения NULL и заменяет их пустыми строками. –

+0

Позвольте мне быть ясным: я люблю значения NULL, просто ненавижу, когда они не используются как NULL. –

Смежные вопросы