假设我在 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 对象,在这种情况下,None
、True
或 False
.
因此,任何 bool
转换都将起作用,将在该字段上起作用,因为这是它在后台所做的。
编辑:
这可能是一个错误。看着 source code for this ,您可以看到它只应该接受值 True
、False
、None
、't'
, 'f'
, '真'
, '假'
, '无'
, '0'
和 '1'
(甚至不是 0
和 1
!)。至少从 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/