交互式shell中忽略了Django唯一字段

时间:2010-12-17 19:03:33

标签: django django-shell

我已经定义了一个名为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的新手,任何人都可以告诉我为什么shell会忽略这个独特的领域?

3 个答案:

答案 0 :(得分:2)

您是否重置了数据库表?我的猜测是你之前没有unique = True定义了模型。

文档说,在管理级别和数据库级别强制执行唯一,这与您的症状相匹配!那是..它适用于管理员,而不是shell。

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

答案 1 :(得分:1)

您使用的数据库是什么?如果您使用sqlite和South,则a bug不允许添加唯一约束,因此sqlite表。

如果是这种情况,可能是管理表单强制执行唯一性,因此检查甚至从未进入数据库,但是当您从命令行执行此操作时,它依赖于数据库来强制执行唯一性(sqlite)在这种情况下不这样做。)

答案 2 :(得分:0)

您确定从Country加载的rack.models是否正在使用您认为的版本?我会检查它上面的__file__,并确保它没有使用它的某些缓存版本。或者,如果您在导入模型后修改模型,则不一定会跳过该模型。

unique 强制模型数据库层的唯一性