【问题标题】:store null as default value againt Null boolean field再次将 null 存储为默认值 Null 布尔字段
【发布时间】:2014-03-03 00:28:52
【问题描述】:

如何在带有SQLlite3 的Django 模型中使用NullBooleanField, 我想将null 存储为nullBoolean 字段的默认值,我该怎么做?

我已将 db 从 BooleanField 迁移到 NullBooleanField,但它仍将 False 存储为默认值。

代码中的用法如下:

LOCATOR_YES_NO_CHOICES = ((None,''), (True,'Yes'), (False, 'No'))
employed = models.NullBooleanField(choices=LOCATOR_YES_NO_CHOICES,
                                max_length=3,
                                blank=True, null=True, default="",)

任何例子都会有很大帮助。

【问题讨论】:

    标签: python django sqlite


    【解决方案1】:

    空字符串"" 不是None

    >>> "" is None
    False
    

    如果您希望默认为None,请编写:

    employed = models.NullBooleanField(choices=LOCATOR_YES_NO_CHOICES,
                                    max_length=3,
                                    blank=True, null=True, default=None,)
    

    【讨论】:

    • 设置 default=None 后,我收到“IntegrityError at /intake/locator/”,它告诉我:“intake_locator.employees 可能不为 NULL”,但该字段定义为 NullBooleanField。
    • 你查过数据库,employee字段是否接受NULL?否则您可能需要更改表格。
    • 更改模型中的字段类型不会自动更改数据库中的表。您需要删除它并再次运行syncdb,或使用south 等工具进行自动架构迁移。
    • @user3269734,您可能需要手动更改数据库架构。 South 做得很好,但有时会漏掉一些东西。
    • 请注意,对于 NullBooleanField,默认值为 blank=True, null=True,因此您无需指定。 docs.djangoproject.com/en/2.0/_modules/django/db/models/fields/…
    【解决方案2】:

    请注意,NullBooleanFIeld 在Django 3.1 中是deprecated。推荐使用BooleanField(null=True)。

    在这种情况下;

    employed = Models.BooleanField(null=True, default=None)
    

    【讨论】:

    • 使用default=None 而不是default=null
    • 我的坏@alias51。不过,使用BooleanField 而不是NullBooleanField 仍然是更好的选择。
    • 同意使用BooleanField 是更好的选择。 Django 4.x 即将发布,RC1 刚刚发布。到那个时候,NullBooleanField 将会死掉,除非有人打算永远运行一个旧的(不安全的)版本的 Django,这是不好的。这应该是正确的答案。
    猜你喜欢
    • 2015-02-21
    • 1970-01-01
    • 2013-09-03
    • 2018-10-22
    • 2011-06-04
    • 2012-01-18
    • 2018-11-17
    • 1970-01-01
    • 2013-12-08
    相关资源
    最近更新 更多