我有福模型,它有字段栏。Bar 字段应该是唯一的,但允许其中包含空值,这意味着如果 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个 Foo 对象,其中 Bar 为 null 时,它会给我一个错误: “ Foo with this Bar already been。”
但是,当我插入数据库(PostgreSQL)时:
insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)
这个工作,只是罚款,它允许我插入超过1条记录与酒吧为空,所以数据库允许我做我想要的,这只是一些错误的 Django 模型。有什么想法吗?
剪辑
就 DB 而言,解决方案的可移植性不是问题,我们对 Postgres 很满意。 我尝试过设置一个可调用函数的唯一值,这个函数对于 酒吧的特定值返回 True/False,它没有给出任何错误,不管它看起来有多么接近,都没有任何效果。
到目前为止,我已经从 酒吧属性中删除了惟一说明符,并在应用程序中处理了 酒吧唯一性,但仍在寻找更优雅的解决方案。有什么建议吗?