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

发布于 2024-11-19 11:50:47 字数 516 浏览 2 评论 0原文

我已经尝试过这些查询并得到以下结果:

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"

切换布尔值

I've tried these queries with these results:

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'}

What I would like is something like this:

queryset.update(done=F('done'))       
{'time': '0.002', 'sql': u'UPDATE "todo_item" SET "done" = "todo_item"."done"'}

But with

SET "done" = !"todo_item"."done"

to toggle the boolean value

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

真心难拥有 2024-11-26 11:50:47

我正在开发 django-orm 扩展,并且已经部分实现了您问题的解决方案。

>>> 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。过段时间我会看看如何改进它。

更新:现已改进并适用于 postgresql、mysql 和 sqlite。

I am developing django-orm extension, and have already partially implemented the solution to your problem.

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

Is a partial solution and not very clean. And so far only for postgresql. In a while I'll see how to improve it.

Update: now improved and works on postgresql, mysql and sqlite.

鲜肉鲜肉永远不皱 2024-11-26 11:50:47

这是标准方法,效果很好

条件表达式

我将用一个更简单的例子来简单地解释它:)

假设我们有 Restaurant 对象(模型),它有 is_close 字段(BooleanField)

并且我们想要切换is_close 对于具有 pk=1 的对象,此代码片段执行以下操作:

r1 = Restaurant.objects.get(pk=1).update(
    is_closed=Case(
        When(is_closed=True, then=False),
        default=True
    ))

This is the standard way and works pretty well

conditional expressions

I'll explain it simply with an even simpler example :)

suppose we have Restaurant objects (model), which has is_closed field (BooleanField)

and we want to toggle is_closed for object with pk=1, this snippet does that:

r1 = Restaurant.objects.get(pk=1).update(
    is_closed=Case(
        When(is_closed=True, then=False),
        default=True
    ))
拥有 2024-11-26 11:50:47
        #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")
        #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")
小女人ら 2024-11-26 11:50:47

对于布尔值,您可以使用更Pythonic的not F(),对于字段上的位否定,请使用~F()

For boolean values, you can use the more Pythonic not F() and for bit negation on fields, use ~F()

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文