我有以下资源:
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的框架内是否可行?
答案 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,他向我展示了这个技巧。