Уникальное поле 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, может кто-нибудь просветить меня, почему оболочка игнорирует уникальное поле?
3 ответа
Вы сбросили таблицу БД? Я предполагаю, что вы определили модель ранее без уникального =True.
В документах говорится, что уникальность применяется на уровне администратора и на уровне базы данных, что соответствует вашим симптомам! То есть.. это работает в админке, а не в оболочке.
Какую базу данных вы используете? Если вы используете sqlite и South, есть ошибка, которая не позволяет добавлять уникальные ограничения, например, таблицы sqlite.
Если это так, возможно, что форма администратора обеспечивает уникальность, поэтому проверка даже не попадает в базу данных, но когда вы делаете это из командной строки, она полагается на базу данных для обеспечения уникальности (что sqlite не делает делай в этом случае).
Вы уверены, что Country
вы загружаете из rack.models
использует версию, которую вы думаете, что это? Я бы проверил __file__
и убедитесь, что он не использует какую-то его кэшированную версию. Или, если вы измените модель после ее импорта, это не обязательно отключит ее.
unique
должен обеспечивать уникальность как на уровне модели, так и на уровне базы данных