1

我定义了一个名为 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 忽略了 unique 字段?

4

3 回答 3

2

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

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

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

于 2010-12-17T19:47:19.150 回答
1

你用的是什么数据库?如果您使用的是 sqlite 和 South,则存在一个不允许添加唯一约束的错误,因此 sqlite 表。

如果是这种情况,可能是管理员表单强制执行唯一性,因此检查甚至永远不会到达数据库,但是当您从命令行执行此操作时,它依赖于数据库来强制执行唯一性(哪个 sqlite 没有在这种情况下做)。

于 2010-12-17T19:14:17.850 回答
0

您确定Country要从中加载rack.models的版本使用的是您认为的版本吗?我会检查__file__它并确保它没有使用它的某些缓存版本。或者,如果您在导入模型后对其进行修改,则不一定会出现这种情况。

unique 应该在模型层数据库层强制唯一性

于 2010-12-17T19:06:40.107 回答