我有这个工作代码从我在测试网址上使用普通GET请求测试的列表中过滤掉:
tag_list = request.GET.get('tag_list').split('&')
tags = Tag.objects.all()
all_species = Species.objects.all()
filtered_species = [all_species.filter(tags__description=c) for c in tag_list]
species = reduce(and_, filtered_species, all_species)
请求将如下所示:
/?tag_list=winged fruit&latex present&foo&bar
如何或在何处将其作为自定义过滤器添加到我的api资源中?
答案 0 :(得分:1)
嗨,我们再次见过#tastypie。
这是一个有趣的问题,并且在这里再次回答可能对其他人有用。
首先你的网址应该是以下形式:
/?tag_list=winged%20fruit&tag_list=latex%20present&tag_list=foo&tag_list=bar
然后,要访问您的tag_list
请求,您必须使用特殊方法getlist
:
request.GET.getlist('tag_list')
我会以这种方式实现查询,但可能会改进此解决方案:
tag_phrases = request.GET.getlist('tag_list')
# Create OR query based on `tag_phrases`
query = Q(tags__description=tag_phrases[0])
for index, tag_phrase in tag_phrases:
if index == 0:
continue
query |= Q(tags__description=tag_phrase)
species = Species.objects.filter(query)
# Some of species might be duplicated
species = set(species)