Django 使用@detail_route会不断返回404、无ID或关键字参数
这是我的@detail\u路线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_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正是获取父级的子级所需的。