python - Django:为什么 NullBooleanField 接受非 bool 答案?

标签 python django

假设我在 Zoo 模型上有一个 NullBooleanField:

class Zoo(models.model):
    lion = NullBooleanField()

为什么它让我保存一个非 bool 字段,然后默认为 true,而不是出错?例如:

my_zoo = Zoo.objects.create()
my_zoo.lion = "Simba"
my_zoo.save() # Surprisingly, no error here.
>>>my_zoo.lion # True

最佳答案

因为 NullBooleanField 只是试图转换为 Python 对象,在这种情况下,NoneTrueFalse.

因此,任何 bool 转换都将起作用,将在该字段上起作用,因为这是它在后台所做的。


编辑:

这可能是一个错误。看着 source code for this ,您可以看到它只应该接受值 TrueFalseNone't''f', '真', '假', '无', '0' '1'(甚至不是 01!)。至少从 Django 1.5 开始就是这样。您使用的是哪个版本的 Django?


编辑 2:

我尝试使用 Django 1.7 重现此结果,结果甚至更奇怪。

>>> zoo = Zoo.objects.create()
>>> zoo.lion = 'Simba'
>>> zoo.save()
>>> zoo.lion
'Simba'
>>> type(zoo.lion)
<type 'str'>

当然,我这里只是覆盖了本地对象上的属性。我也可以这样做:

>>> zoo.walrus = 'Simba'
>>> zoo.walrus
'Simba'

但是,当我通过将本地对象从数据库中拉回来刷新本地对象时:

>>> zoo = Zoo.objects.get(pk=1)
>>> zoo.lion
True
>>> type(zoo.lion)
<type 'bool'>

在任何时候都没有引发异常,但它确实被转换为 bool 值。我开始猜测甚至在哪里调用了 to_python

关于python - Django:为什么 NullBooleanField 接受非 bool 答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618299/

相关文章:

python - 有没有办法在 pocketsphinx python 中返回整个字典条目(单词+音素)?

python - Django:不可散列类型: 'list'

django - 一个 Django 项目的多个域托管

python - 使用 JWT token 对 Django Rest Framework 中的 POST 请求进行未经授权的响应

python - 分组依据后的注释最大值

python - 将 n 维数组缩减为带有附加列的二维数组

python - 使用 all() 对大量项目进行验证

python - 使用补丁线程与原生 gevent greenlets 的缺点?

python - Django 模型 "blob"字段

python - PyCharm 找不到 Django 测试