2013-06-18 63 views
0

我有以下资源:Tastypie:过滤通过ToManyField

class SpecResource(ModelResource): 
    results = fields.ToManyField('(...).ResultResource', 'result_set', full=True) 
    (...) 

class ResultResource(ModelResource): 
    number = fields.IntegerField() 
    spec = fields.ForeignKey('(...).SpecResource', 'spec') 
    (...) 

,这样,当我看一个规范JSON它包含有一个ForeignKey该规范的结果列表。现在我想过滤当看到规范JSON时显示的结果,并且我希望能够按照过滤规则列表的方式过滤URL眼镜。那可能吗?为了进一步说明,我想转到“/ api/spec/1 /?number = 5”,并获得与如果转到“/ api/spec/1/“结果字段仅包含数字= 5的结果。

这是可能在tastypie的框架内吗?

回答

2

这已经有一段时间,因为你张贴在这里,但你会发现在@kroolik给了我类似的情况,建立在一个“套” ToManyField相关资源的过滤器答案一块的解决方案:https://stackoverflow.com/a/20035610/1387495

这里是主要的想法:

你可以扩展你传递给结果场与全面功能的属性参数和重用ResultResourceres.obj_get_list可根据您的ResultResource处理构建和应用过滤器。您只需要在parent_id上进行进一步过滤。

在代码:

class SpecResource(ModelResource): 
    results = fields.ToManyField('(...).ResultResource', attribute=lambda bundle: filter_result_items(bundle), full=True) 

def filter_result_items(bundle): 
    res = ResultResource() 
    new_bundle = Bundle(request=bundle.request) 
    objs = res.obj_get_list(new_bundle) 
    return objs.filter(parent_id=bundle.obj.pk) 

再次感谢@kroolik,谁发现我这一招。

+0

尽管此链接可能回答此问题,但最好在此处包含答案的重要部分并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 –

+0

这不提供问题的答案。要批评或要求作者澄清,在他们的帖子下留下评论 - 你总是可以评论你自己的帖子,一旦你有足够的[声誉](http://stackoverflow.com/help/whats-reputation),你会能够[评论任何帖子](http://stackoverflow.com/help/privileges/comment)。 –

+0

@JB。注意到,我编辑了我的答案以适合您的要求。谢谢! – Daemon12