为我的tastypi资源构建自定义过滤器

时间:2014-09-18 15:58:17

标签: python django rest tastypie

我有这个工作代码从我在测试网址上使用普通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资源中?

1 个答案:

答案 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)