我已经定义了一个名为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会忽略这个独特的领域?
答案 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
应强制模型和数据库层的唯一性