Уникальное поле Django игнорируется в интерактивной оболочке - PullRequest
1 голос
/ 17 декабря 2010

Я определил класс с именем 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, может кто-нибудь объяснить мне, почему оболочка игнорирует уникальное поле?

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

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

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

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

1 голос
/ 17 декабря 2010

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

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

0 голосов
/ 17 декабря 2010

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

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

...