Django 使用@detail_route会不断返回404、无ID或关键字参数

Django 使用@detail_route会不断返回404、无ID或关键字参数,django,rest,django-rest-framework,Django,Rest,Django Rest Framework,这是我的@detail\u路线 @detail_route() def children(self, request): parent = self.get_object() children = parent.parent_children.all() serializer = ChildSerializer(children) return Response(serializer.data) 如果我没有包含PK或**KWARG,我会得到错误: childre

这是我的@detail\u路线

@detail_route()
def children(self, request):
    parent = self.get_object()
    children = parent.parent_children.all()
    serializer = ChildSerializer(children)
    return Response(serializer.data)
如果我没有包含PK或**KWARG,我会得到错误:

children() got an unexpected keyword argument 'pk'
'QuerySet' object has no attribute 'id'
如果我将PK或**kwargs添加到子参数,我会得到错误:

children() got an unexpected keyword argument 'pk'
'QuerySet' object has no attribute 'id'
如果我将PK添加到参数中,并将PK传递给get_object(),则该集合将出现404个错误,即使它在其中


我不明白为什么这些都会产生如此不同的错误。我的期望是,如果我转到
/api/parent/7/children
,我将获得从Django REST Framework 2.4开始的该父级的子级列表,那么在初始化数据列表的序列化程序(如QuerySet)时,您应该传递
many=True

为了解决您遇到的问题,您应该将
pk
format
传递到路由中,并在
ChildSerializer
上设置
many=True

@detail_route()
def children(self, request, pk, format=None):
    parent = self.get_object()
    children = parent.parent_children.all()
    serializer = ChildSerializer(children, many=True)
    return Response(serializer.data)

这将告诉序列化程序将传入数据解释为列表,而不是单个对象。

但是您需要父对象的PK才能获取子对象,因此需要详细信息路由。如果您使用列表路径,则您没有PK来获取子级。如果我使用列表路径,则我无法访问父级的PK,而父级的PK正是获取父级的子级所需的。