2015-09-02 30 views
3

我有问题模型BooleanField:Django的BooleanField接受非布尔类型的对象

class Question(models.model): 
    is_deleted = BooleanField() 

为什么会接受非布尔类型的Python对象?

>>>que_obj = Question.objects.create() 
>>>que_obj.is_deleted='yes' 
>>>que_obj.save() 
>>>que_obj.is_deleted 
>>>'yes' 
+1

你使用SQLite吗?如果yes看起来不再进一步--SQLite不关心类型 - 并切换到真正的dbms(或至少一个半支持的)。 –

+0

@peter其实,并非如此。在普通的python中,你当然会调用[setter](http://stackoverflow.com/a/2627034/5031339) – NightShadeQueen

+0

@NightShadeQueen啊。我的错。 –

回答

2

一个模型实例仅仅是一个Python对象。您可以将任何属性设置为任何值。

当你保存实例时,所有的数据都被转换成合适的数据类型,以达到Django的最佳能力。对于BooleanField这意味着任何真值(bool(value) is True)被保存为True并且任何虚假值(bool(value) is False)被保存为False

保存模型时,将读取该字段的当前值,转换为适当的数据类型并保存到数据库。该字段的原始值不会更改。从数据库中重新加载模型时,该字段的实际值将保存在数据库中:True

+0

是的。转换为bool类型。所以你说它可能将任何属性设置为任何值? – ramganesh

+1

在python级别 - 是的。当您保存该对象并将该值转换为数据库值时,您可能会遇到某些字段类型的错误。例如,Django无法将''yes''转换为'DateTimeField'的有效日期时间对象。一个'BooleanField'没有这个问题('bool(value)'在任何python值上工作),所以你不会在那里得到任何错误。 – knbk

+0

现在明确:)很好的答案。 Django有将值转换为正确类型的方法。 – ramganesh

0

peter是右您行:

que_obj.is_deleted='yes' 

将覆盖布尔值到现在包含字符串 '是'。你可以用bool()功能检查布尔值象下面这样:

que_obj.is_deleted=bool('yes') 

这里的docs条目bool()

相关问题