我有两个模型,Foo并且Bar. Bar有一个外键Foo. 我有一个ModelViewSetfor Foo,我希望路由/api/foos/<pk>/bars/返回与bar给定相关的所有 s foo。
我知道这可以通过操作来完成。例如
class FooViewSet(viewsets.ModelViewSet):
serializer_class = FooSerializer
queryset = Foo.objects.all()
@action(detail=True, methods=['GET'])
def bars(self, request, pk):
queryset = Bar.objects.filter(foo=pk)
serializer = BarSerializer(queryset, many=True)
return Response(serializer.data)
@bars.mapping.post
def create_bar(self, request, pk):
request.data['foo'] = pk
serializer = BarSerializer(request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
Run Code Online (Sandbox Code Playgroud)
然而,这感觉像是很多不必要的样板代码。
不幸的是,使用bars = PrimaryKeyRelatedField(many=True)不适合我的情况,因为每个foo可以有数百个bars,我不想在每个请求中发送。
这是否可以在视图集中以更方便的方式完成?如果没有,DRF 的正常做法是什么?只要能最大限度地减少样板代码,具有不同 URL 的解决方案对我来说也是可以接受的。