【问题标题】:Toggle boolean fields from a Queryset using F objects使用 F 对象从查询集中切换布尔字段
【发布时间】:2011-10-02 08:48:29
【问题描述】:

我已经用这些结果尝试了这些查询:

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"

切换布尔值

【问题讨论】:

    标签: python sql django boolean django-queryset


    【解决方案1】:

    我正在开发 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。

    【讨论】:

      【解决方案2】:
              #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")
      

      【讨论】:

      • 欢迎来到 StackOverflow!虽然此代码可能会回答问题,但提供有关 为什么 和/或 如何 此代码回答问题的附加上下文会提高其长期价值。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        这是标准方法,效果很好

        conditional expressions

        我会用一个更简单的例子来简单解释一下:)

        假设我们有 Restaurant 对象(模型),其中有 is_closed 字段(BooleanField)

        我们想要为具有 pk=1 的对象切换 is_closed,这个 sn-p 会这样做:

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

        【讨论】:

          猜你喜欢
          • 2021-11-21
          • 2017-06-15
          • 1970-01-01
          • 1970-01-01
          • 2023-03-16
          • 1970-01-01
          • 2017-12-27
          • 1970-01-01
          • 2015-12-15
          相关资源
          最近更新 更多