2015-09-02 32 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()

相關問題