如何在额外字段上过滤Django Queryset?

时间:2015-02-04 05:15:14

标签: python django orm django-queryset

这是我的Django模型:

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

我想检索a = 5b + 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'")

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

您可以使用真实字段名称复制查询吗?可能你错了吗?