【发布时间】:2010-10-02 01:13:51
【问题描述】:
我有具有字段栏的模型 Foo。 bar 字段应该是唯一的,但允许其中包含 null,这意味着如果 bar 字段是 null,我希望允许多个记录,但如果不是 null,则值必须是唯一的。
这是我的模型:
class Foo(models.Model):
name = models.CharField(max_length=40)
bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None)
这里是表对应的SQL:
CREATE TABLE appl_foo
(
id serial NOT NULL,
"name" character varying(40) NOT NULL,
bar character varying(40),
CONSTRAINT appl_foo_pkey PRIMARY KEY (id),
CONSTRAINT appl_foo_bar_key UNIQUE (bar)
)
当使用管理界面创建超过 1 个 bar 为 null 的 foo 对象时,它会给我一个错误:“带有此 Bar 的 Foo 已经存在。”
但是当我插入数据库(PostgreSQL)时:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
这行得通,很好,它允许我插入超过 1 条 bar 为空的记录,所以数据库允许我做我想做的事,只是 Django 模型有问题。有什么想法吗?
编辑
就 DB 而言,解决方案的可移植性不是问题,我们对 Postgres 很满意。 我尝试为可调用设置唯一性,这是我的函数为 bar 的特定值返回 True/False,它没有给出任何错误,但接缝就像它根本没有效果一样。
到目前为止,我已经从 bar 属性中删除了唯一说明符并处理了应用程序中的 bar 唯一性,但仍在寻找更优雅的解决方案。有什么建议吗?
【问题讨论】:
-
我还不能发表评论,所以在这里对mightyhal 做一点补充:从Django 1.4 开始,您需要
def get_db_prep_value(self, value, connection, prepared=False)作为方法调用。查看groups.google.com/d/msg/django-users/Z_AXgg2GCqs/zKEsfu33OZMJ 了解更多信息。以下方法也适用于我: def get_prep_value(self, value): if value=="": #if Django 尝试保存 '' 字符串,发送 db None (NULL) return None else: return value #otherwise, just传递价值 -
我为此开了一张 Django 票。添加您的支持。 code.djangoproject.com/ticket/30210#ticket
标签: django orm django-models