【问题标题】:Tastypie: Filtering by ToManyFieldTastypie:按 ToManyField 过滤
【发布时间】:2013-06-18 09:48:47
【问题描述】:

我有以下资源:

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 的结果。

这可能在tastepie 的框架内吗?

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    自从您在此处发布以来已经有一段时间了,但您可能会在@kroolik 在类似情况下给我的答案中找到一个解决方案,在“嵌套”ToManyField 相关资源上构建过滤器:https://stackoverflow.com/a/20035610/1387495

    这里是主要思想:

    您可以使用完整的函数扩展您传递给 results 字段的 attribute 参数,并重用 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,他向我展示了这个技巧。

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
    • @JB。注意,我编辑了我的答案以满足您的要求。谢谢!
    • @MihaiMaruseac 这个编辑后的帖子现在确实提供了对这个问题的明确答案。谢谢。
    猜你喜欢
    • 2013-01-03
    • 2013-11-30
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多