使用F对象从查询集切换布尔字段



我尝试了这些查询,结果如下:

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()

相关内容

  • 没有找到相关文章

最新更新