2012-08-05 63 views
1

我有一个模型实例,它有一个布尔型字段。我想要实现的是将值从True切换到False,反之亦然。用Django中的更新方法切换布尔型字段的值

当然,我可以只写:

inst = Model.objects.get(id=1) 
inst.boolean_field = not inst.boolean_field 
inst.save() 

但也有2个查询:一个用于读取,另一个用于更新。

我想只是切换的值,但以下似乎不工作:

Model.objects.filter(id=1).update(boolean_field=not F("boolean_field")) 

我敢肯定,我做错了什么,或者它是不可能的。

回答

5

不幸的是,django目前还不支持F() object的否定。

当你做not F('boolean_field')它被评估为True,所以更新操作总是保存True。例如

>>> F('boolean_field') 
<django.db.models.expressions.F object at 0x36b7d50> 
>>> not F('boolean_field') 
True 

参考Django上这个bug 17186 - Inverted F expression (negation)

0

您可以使用Case代替:

from django.db.models import Case, Value, When 

queryset.update(active=Case(
    When(active=True, then=Value(False)), 
    When(active=False, then=Value(True)), 
)) 
相关问题