【问题标题】:Using Django Rest Framework > 2.4 to get children of parent with @detail_route使用 Django Rest Framework > 2.4 通过@detail_route 获取父级的子级
【发布时间】:2014-09-13 03:50:33
【问题描述】:

我的这个工作比 DRF 2.4 差很多,但是到 2.4+ 的更改使用 @detail_route。

当我对/api/parent/7/children 执行 GET 操作时,我希望得到属于 Parent 7 的所有孩子。

但我得到一个空数组。

这是我的代码:

class ParentViewSet(viewsets.ModelViewSet):
    serializer_class = ParentSerializer
    model = models.Parent

    @detail_route()
    def children(self, request, pk):
        parent = self.get_object()
        children = parent.children.all()
        serializer = ChildrenSerializer(children)
        return Response(serializer.data)

    def get_queryset(self):
        if self.request.user.is_superuser:
            return models.Parent.objects.all()
        else:
            return models.Parent.objects.filter(user=self.request.user)

    def pre_save(self, obj):
        obj.user = self.request.user

当我在 API 查看器中转到端点 /api/parent/7/children 时,我得到的响应是:

{
    "detail": "Not found"
}

有什么建议吗?

原则上我更喜欢这个,你可以对正在发生的事情进行更多的陈述。我知道我可以在children 上设置方法,因此我不必为同一资源执行@link 和@action。只需要克服这个障碍。

谢谢!

【问题讨论】:

    标签: json django rest django-views django-rest-framework


    【解决方案1】:

    我不知道这是否是您的问题,但您在示例中存在拼写错误...

    children = parent.children.all()
    serializer = ChildrenSerializer(Children)
    

    应该是:

    children = parent.children.all()
    serializer = ChildrenSerializer(children)
    

    您传递的是要序列化的 Children 类,而不是子实例。

    【讨论】:

    • 我希望这就是问题所在。我修正了错字。谢谢汤姆。除此之外,它看起来对吗?
    • 对我来说很合适。 (还请注意,get_object 不应该接受任何参数,至少在最新版本中是这样。)我会在你的 children 方法中进行一些调试 - 它被调用了吗? .get_object() 返回的是什么? children 查询集中是否有任何项目等...
    • 我得到的响应是: { "detail": "Not found" } 。我将编辑上面的内容以从 get_object() 中获取 pk。
    • 澄清一下,如果我没有在 get_object 中包含 PK,我会收到有关“'QuerySet' 对象没有属性'id''的错误消息”
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    相关资源
    最近更新 更多