Tastypie:由ToManyField过滤

时间:2013-06-18 09:48:48

标签: python django tastypie

我有以下资源:

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 /”时相同的JSON。 之外,结果字段仅包含数字= 5的结果。

这在tastypie的框架内是否可行?

1 个答案:

答案 0 :(得分:2)

自从你在这里发布以来已经有一段时间了,但是你可能会在@kroolik给出我类似情况的答案中找到一个解决方案,在'嵌套'ToManyField相关资源上构建一个过滤器:{{3} }

这是主要的想法:

  

您可以使用完整功能扩展已传递到结果字段的属性参数,并重用 ResultResource 。    res.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,他向我展示了这个技巧。