我尝试了这些查询,结果如下:
queryset.update(done=not F('boolean'))
{'time': '0.001', 'sql': u'UPDATE "todo_item" SET "done" = True'}
queryset.update(done=(F('boolean')==False))
{'time': '0.001', 'sql': u'UPDATE "todo_item" SET "done" = False'}
我想要的是这样的:
queryset.update(done=F('done'))
{'time': '0.002', 'sql': u'UPDATE "todo_item" SET "done" = "todo_item"."done"'}
但是
SET "done" = !"todo_item"."done"
切换布尔值
我正在开发django- form扩展,并且已经部分实现了您的问题的解决方案。
>>> from django_orm.expressions import F
>>> from niwi.models import TestModel
>>> TestModel.objects.update(done=~F('done'))
# SQL:
UPDATE "niwi_testmodel" SET "done" = NOT "niwi_testmodel"."done"; args=()
https://github.com/niwibe/django-orm 是部分解,不是很干净。到目前为止,只针对postgresql。过一会儿我看看如何改进它。
这是标准的方式,效果很好
条件表达式
我用一个更简单的例子来解释:)
假设我们有Restaurant objects (model),它有is_closed field (BooleanField)
在pk=1为对象切换is_closed,下面的代码段做到了这一点:r1 = Restaurant.objects.get(pk=1).update(
is_closed=Case(
When(is_closed=True, then=False),
default=True
))
#update_status
update_status = (
"UPDATE csv SET status = (NOT csv.status) "
"WHERE id = %s")
print(random_number)
cursor.execute(update_status, (random_number))
print("update_status")
对于布尔值,您可以使用更python化的not F()
,对于字段的位否定,使用~F()