如何在Django中有效查询"any"?

How to effectively query "any" in Django?

例如查询为:

a = request.GET['country']
b = request.GET['name']
c = request.GET['title']
...
result = models.Data.objects.filter('country' = a, 'name' = b, 'title' = c, ...)

如果其中一个a b c是"Any"怎么办?

我的意思是如果我从前端接收到 a="Any",我应该如何有效地释放过滤器中的这个限制?

您可以创建一个函数,根据参数构建 Q object

def _get_filter(name, value):
    return Q() if value == 'Any' else Q((name, value))

并将它们与 &:

合并
q = (
    _get_filter('country', request.GET['country']) &
    _get_filter('name', request.GET['name']) &
    _get_filter('title', request.GET['title'])
)

result = models.Data.objects.filter(q)

如果可能的话,我还会获取请求的来源(前端?)以发送更好的值来指示“Any”,例如空字符串。

您不必在单个查询中完成所有操作。直到一切都完成后,查询才 运行。

您可以使用:

result = models.Data.objects.all()

if a != 'any':
    result = result.filter('country' = a)
if b != 'any':
    result = result.filter('name' = b)
if c != 'any':
    result = result.filter('title' = c)
...

在一切都完成之前,查询不会 运行 对数据库,所以这实际上不会添加任何额外的查询。