繁体   English   中英

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

[英]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 = 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'")

您可以将b + c > 10b > 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM