Уникальное поле Django игнорируется в интерактивной оболочке

Я определил класс Country с уникальным полем имени.

class Country(models.Model):
    class Meta:
        verbose_name_plural = "Countries"
    name = models.CharField(max_length=100, unique=True, null=False)
    def __unicode__(self):
        return self.name

На странице администратора это ведет себя так, как я и ожидал. При создании страны, которая уже есть в базе данных, возникает ошибка «Страна с таким названием уже существует». Идеальный.

Когда я пытаюсь проверить то же самое в интерактивной подсказке (manage.py shell), такой ошибки не выдается. Вместо этого дубликат объекта просто добавляется в базу данных.

>>> from rack.models import Country
>>> usa = Country(name="United States of America")
>>> usa.save()
>>> canada = Country(name="United States of America")
>>> canada.save()
>>> canada.name
'United States of America'
>>> Country.objects.all()
[<Country: United States of America>, <Country: United States of America>]

Я новичок в Django, может ли кто-нибудь просветить меня, почему оболочка игнорирует уникальное поле?


person Kenny Rasschaert    schedule 17.12.2010    source источник
comment
Это не дает ответа на ваш вопрос о принудительном применении «уникального», но может оказаться полезным: code.google.com/p/django-countries. Я не автор, но я использовал его в проекте или двух.   -  person Chris Lawlor    schedule 17.12.2010


Ответы (3)


Вы сбрасывали таблицу БД? Я предполагаю, что вы ранее определили модель без unique=True.

В документах говорится, что уникальность применяется на уровне администратора и на уровне базы данных, что соответствует вашим симптомам! То есть.. он работает в админке, а не в шелле.

http://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.Field.unique

person Yuji 'Tomita' Tomita    schedule 17.12.2010
comment
Я удалил таблицу (в любом случае это была ранняя работа) и сделал еще одну syncdb. Теперь оболочка выдает мне IntegrityError: duplicate key violates unique constraint "rack_country_name_key" Спасибо за решение этой загадки! - person Kenny Rasschaert; 17.12.2010

Какую базу данных вы используете? Если вы используете sqlite и South, существует ошибка, которая не позволяет добавлять уникальные ограничения, поэтому sqlite-таблицы.

Если это так, возможно, форма администратора обеспечивает уникальность, поэтому проверка никогда не попадает в базу данных, но когда вы делаете это из командной строки, она полагается на базу данных для обеспечения уникальности (что sqlite не делает). сделать в этом случае).

person Andrew C    schedule 17.12.2010
comment
Я использую базу данных PostgreSQL 8.1.22. - person Kenny Rasschaert; 17.12.2010
comment
+1, так как технически это мог быть правильный ответ на мой вопрос. Это может помочь кому-то еще с такими же симптомами. - person Kenny Rasschaert; 17.12.2010

Вы уверены, что Country, который вы загружаете из rack.models, использует версию, которую вы думаете? Я бы проверил на нем __file__ и убедился, что он не использует какую-то кешированную версию. Или, если вы измените модель после ее импорта, это не обязательно сработает.

unique следует обеспечивать уникальность как на уровне модели, и на уровне базы данных

person Daniel DiPaolo    schedule 17.12.2010