在我的应用中,我有一张表格。根据表单,用户可以配置一个或多个过滤器。
在我看来,我有例证:
query = Test.objects.filter(filter1 = request.post['filter1'], filter2 = request.post['filter2'], filter3 = request.post['filter3'])
因此,有时filter1,filter2或filter3可能不存在。
如果没有任何过滤器,我只想忽略过滤器。
我可以用很多“IF”条件做一个脚本,但可能有一个聪明的解决方案吗?
感谢您的帮助!
答案 0 :(得分:5)
您可以采取以下措施:
filters = {}
for key, value in request.post.items():
if key in ['filter1', 'filter2', 'filter3']:
filters[key] = value
Test.objects.filter(**filters)
其中列表是您打算按
过滤的键列表修改强>
正如Thomas Junk建议你可以通过理解让它变得更清晰:
filters = {
key: value
for key, value in request.post.items()
if key in ['filter1', 'filter2', 'filter3']
}
Test.objects.filter(**filters)
答案 1 :(得分:0)
此代码解决了我的问题:
if request.method == 'GET':
filters = {}
for key, value in request.GET.items():
if value != '':
filters[key] = value
filter_list=Pet.objects.filter(**filters)
答案 2 :(得分:0)
你可以使用这样的东西:
loop{loop{}}
在这个例子中:
import ast
def query_to_dict(query) -> dict:
filters = {}
for field, value in query.items(): # <- param and value like ?param1=True
filters[field] = ast.literal_eval(str(value)) # <- parse list/str/bool
return filters
def event_view(request):
events = Event.objects.filter(
Q(**query_to_dict(request.GET))
)
return Response(
EventsSerializer(events, many=True).data
)
- 帮助解析 bool 值和列表的模块
ast
- 这是您的查询参数 request.GET
。确保以 ?param1=True¶m2="[1, 2]"
之类的方式传递参数 - 使用双引号
?title="hello"
- 将查询参数转换为 python dict 的函数。因此您可以将此 dict 传递给您的 query_to_dict
。
以这种方式使用过滤的好处,您可以传递 Event.objects.filter
这样的东西,它会起作用。我不能肯定它是否安全,但对于一些复杂的过滤或布尔字段过滤它是完美的。