如何在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)
...
在一切都完成之前,查询不会 运行 对数据库,所以这实际上不会添加任何额外的查询。
例如查询为:
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)
...
在一切都完成之前,查询不会 运行 对数据库,所以这实际上不会添加任何额外的查询。