[英]How can I filter a Django Queryset on an extra field?
这是我的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'")
您可以将b + c > 10
为b > 10 - c
,然后使用F内置函数
MyModel.objects.filter(a=5).filter((b__gt=10-models.F('c'))
使用Django extra()
并不十分安全
每当你使用extra()时都应该非常小心。 每次使用它时,都应该使用params来转义用户可以控制的任何参数,以防止SQL注入攻击。 请阅读有关SQL注入保护的更多信息。
在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))
你能用真实的字段名复制你的查询吗? 可能你错了吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.