【问题标题】:How can I filter a Django Queryset on an extra field?如何在额外字段上过滤 Django 查询集?
【发布时间】:2015-04-03 12:54:56
【问题描述】:

这是我的 Django 模型:

from django.db import models
class MyModel(models.Model):
    a = models.IntegerField()
    b = models.IntegerField()
    c = models.IntegerField()

我想检索该模型的所有实例,其中 a = 5 和 b + c > 10。我该怎么做?

当我尝试这个时:

print MyModel.objects.filter(a=5).extra(
    select={"total_count": "b + c"},
    where=["total_count > 10"],
)

我收到此错误:

OperationalError: (1054, "Unknown column 'total_count' in 'where clause'")

【问题讨论】:

    标签: python django orm django-queryset


    【解决方案1】:

    您可以将b + c > 10 转换为b > 10 - c,然后使用F built-in function

    MyModel.objects.filter(a=5).filter((b__gt=10-models.F('c'))
    

    使用 Django extra() 不太安全

    每次使用 extra() 时都应该非常小心。每次你 使用它,您应该转义用户可以控制的任何参数 使用参数来防止 SQL 注入攻击。 请阅读有关 SQL 注入保护的更多信息。

    【讨论】:

      【解决方案2】:

      在 django 1.7 中,此过滤器工作正常并产生以下查询:

      SELECT (b + c) AS "total_count", "app_mymodel"."id", "app_mymodel"."a",
             "app_mymodel"."b", "app_mymodel"."c" 
      FROM "app_mymodel"
      WHERE ("app_mymodel"."a" = 5 AND (total_count > 10))
      

      你能用真实的字段名复制你的查询吗?你可能是在某个地方打错了吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-13
        • 2017-03-09
        • 2019-02-17
        • 1970-01-01
        • 2015-05-06
        • 2011-05-16
        • 2018-10-28
        相关资源
        最近更新 更多