这是我的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'")
答案 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))
您可以使用真实字段名称复制查询吗?可能你错了吗?