gpt4 book ai didi

django - Django Rest Framework 中嵌套 URL 的相关资源

转载 作者:行者123 更新时间:2023-12-03 23:51:12 25 4
gpt4 key购买 nike

我有两个型号,FooBar . Bar有一个指向 Foo 的外键.我有一个 ModelViewSetFoo我想要路线 /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)

然而,这感觉就像是很多不必要的样板代码。

使用 bars = PrimaryKeyRelatedField(many=True)不幸的是不适合我的情况,因为每个 foo可以有几百个 bars ,我不想在每个请求中发送。

这有可能以更方便的方式在 View 集中进行吗?如果没有,正常的 DRF 方法是什么?具有不同 URL 的解决方案对我来说也是可以接受的,只要它最大限度地减少样板代码。

最佳答案

对我来说直接的解决方案是使用一个简单的 generics.ListAPIView 对于此特定端点:

views.py


from rest_framework import generics


class FooBarsListAPIView(generics.ListAPIView):
serializer_class = BarSerializer

def get_queryset(self):
return Bar.objects.filter(foo=self.kwargs.get('pk'))

然后你只需在你的 urls.py 中注册这个 View 而不是 View 集。

这就是您需要做的一切,以实现您想要的结果。您只需指定查询集过滤器的外观,其他一切都由 ListAPIView 完成。执行。

View 集在大多数情况下都在做这项工作,但如果你想要这样的特定东西, View 集可能会成为一种矫枉过正的东西。
是的,现在为这个特定的端点定义了一个额外的类,但是样板代码减少到零,这是我们最终想要的。

关于django - Django Rest Framework 中嵌套 URL 的相关资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57538420/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com