当前位置: 首页 > 面试题库 >

在Django中允许为空的唯一字段

宗政松
2023-03-14
问题内容

我有Foo模型,其中有栏杆。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)
)   

当使用管理界面在bar为null的情况下创建多个1个foo对象时,它给我一个错误:“此Bar的Foo已经存在。”

但是,当我插入数据库(PostgreSQL)时:

insert into appl_foo ("name", bar) values ('test1', null)
insert into appl_foo ("name", bar) values ('test2', null)

这样做很好,它允许我插入1条以上且bar为null的记录,因此数据库允许我执行我想要的操作,这是Django模型的错误。有任何想法吗?

编辑

就数据库而言,解决方案的可移植性不是问题,我们对Postgres感到满意。我尝试过设置可调用对象的唯一性,这是我的函数针对bar的特定值html" target="_blank">返回True / False ,它没有给出任何错误,但是接缝就像根本没有任何作用。

到目前为止,我已经从bar属性中删除了唯一的说明符,并在应用程序中处理了bar的唯一性,但是仍在寻找更优雅的解决方案。有什么建议吗?


问题答案:

自从票务#9039被修复以来,Django就唯一性检查的目的没有将NULL视为NULL,请参阅:

http://code.djangoproject.com/ticket/9039

这里的问题是,表单CharField的规范化“空白”值是一个空字符串,而不是无。因此,如果将该字段保留为空白,则会得到一个空字符串,而不是NULL,存储在数据库中。在Django和数据库规则下,空字符串等于用于唯一性检查的空字符串。

你可以通过使用clean_bar方法为Foo提供自己的自定义模型表单,从而将空字符串转换为None,从而强制管理界面为空字符串存储NULL:

class FooForm(forms.ModelForm):
    class Meta:
        model = Foo
    def clean_bar(self):
        return self.cleaned_data['bar'] or None

class FooAdmin(admin.ModelAdmin):
    form = FooForm


 类似资料:
  • 问题内容: 我有一个存储产品代码的字段。该代码是唯一的,但是某些产品根本没有代码。我无法发明代码,因为它们是提供商代码。 在MySQL中这种约束可能吗? 我是一个存储过程和触发器的菜鸟,所以如果解决方案涉及其中之一,请耐心等待。 更新:列不为空。这就是为什么我无法做到这一点。 问题答案: 是的,您可以这样做。参见MySQL参考(版本5.5)。 UNIQUE索引会创建约束,以使索引中的所有值都必须不

  • 问题内容: 我想使用数据库模型为我的项目控制一些配置设置。例如: 此模型应该只有一个实例: 当然,如果有人不小心创建了一个新实例,那就不是世界末日了。我可以做。但是,是否有一种方法可以将其锁定,从而无法创建多个实例? 鉴于Django从那时起发生了很大变化,是否有解决此问题的标准方法?还是我应该只使用并接受可能重复的内容? 问题答案: 您可以重写方法以控制实例数:

  • 作为ETL的一部分,表具有连续的传入记录流 新记录被聚合并被插入temp。名为的表每5分钟一次。 将所有记录插入表并在下一个循环中重新创建后,表将被删除 表格 注意:列previous_station和next_station允许为空。 复合唯一键添加如下: 如果插入时违反了唯一密钥,则应更新记录。所以使用了upsert策略。 当所有列的值都存在时,此设置可以完美地工作,但当任何可为空的列都有空值

  • 我有一个包含用户及其密码的数据库。当我启动应用程序时,我会创建一些具有角色的用户,并将其存储到数据库中。我的用户实体: 和用户角色实体 默认情况下,列角色是唯一的=false,但当我添加userA与角色:管理员,用户,然后userB与角色:用户,记录userB-用户覆盖记录userA-用户。有人能指出我的错误是什么吗? 我正在使用hibernate 5 spring 5

  • 关于Oracle中对可为空的列进行唯一约束定义的可能解决方案,我想向你们请教/收集一些想法。 null 现在困难的部分来了。我决定,在这个表中,可以存储更多(独立)客户的数据。为此,我添加了名为customer_code的新列。这段代码实际上将表分割成不同的空格,而每个客户只能看到自己的数据。 为此,引入了oracle vpd(虚拟专用数据库)。 每个客户都使用自己的oracle用户 登录时,将加

  • 问题内容: 如何使用T-SQL更改表中的一个属性以允许为null(不为null-> null)?也许更改表? 问题答案: