2015-09-02 2 views
3

У меня есть BooleanField на Вопрос модели:Джанго BooleanField принимать не-логический тип объекта

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

Почему это принять не-булево объект типа питона?

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

Вы используете SQLite? Если «да» больше не выглядит - SQLite не заботится о типах - и переключается на реальный dbms (или, по крайней мере, на половину поддержки). –

+0

@peter На самом деле, неправда. В обычном python вы вызываете [setter] (http://stackoverflow.com/a/2627034/5031339) – NightShadeQueen

+0

@NightShadeQueen ah, конечно. Виноват. –

ответ

2

Экземпляр модели только питон объект. Вы можете установить любой атрибут для любого значения.

При сохранении экземпляра все данные преобразуются в соответствующие типы данных в наилучшие возможности Django. Для BooleanField это означает, что любое истинное значение (bool(value) is True) сохраняется как True, и любое значение ложности (bool(value) is False) сохраняется как False.

При сохранении модели текущие значения поля считываются, преобразуются в соответствующий тип данных и сохраняются в базе данных. Исходное значение поля не изменяется. Когда вы загружаете модель из базы данных, в поле будет сохранено фактическое значение в базе данных: True.

+0

есть. Преобразован в тип bool. поэтому вы говорите, что можно установить любой атрибут на любое значение? – ramganesh

+1

На уровне python - да. Когда вы сохраняете объект и значение преобразуется в значение базы данных, вы можете столкнуться с ошибкой для некоторых типов полей. Например, Django не может преобразовать '' yes'' в действительный объект datetime для '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()

Смежные вопросы