【问题标题】:Django unique field ignored in interactive shell交互式shell中忽略的Django唯一字段
【发布时间】:2011-05-27 07:29:09
【问题描述】:

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

【问题讨论】:

  • 这并不能回答您关于强制执行“唯一”的问题,但您可能会发现这很有用:code.google.com/p/django-countries。我不是作者,但我在一两个项目中使用过它。

标签: django django-shell


【解决方案1】:

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

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

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

【讨论】:

  • 我放下了桌子(无论如何这是一项早期工作)并做了另一个同步数据库。现在shell给了我IntegrityError: duplicate key violates unique constraint "rack_country_name_key"感谢你解开这个谜!
【解决方案2】:

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

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

【讨论】:

  • 我正在运行 PostgreSQL 8.1.22 数据库。
  • +1 因为从技术上讲它可能是我问题的正确答案。它可能会帮助遇到相同症状的其他人。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    • 2019-12-31
    • 2014-02-02
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    相关资源
    最近更新 更多