Django Rest Framework get_queryset 被多次调用

aja*_*xon 6 django-rest-framework

当向我的 ListAPIView 发出请求时,会多次调用 get_queryset() 方法。它被调用了 4 次,直到我删除了默认的 django 模型权限,但现在它仍然被调用了两次。还有什么可能导致重复呼叫。

class PropertyPledgeList(generics.ListAPIView):

    serializer_class = PledgeListSerializer

    ordering_fields = ('amount_cents')

    def get_queryset(self):
        slug = self.kwargs['slug']
        return get_object_or_404(Property, slug=slug).pledges.all().prefetch_related("user")
Run Code Online (Sandbox Code Playgroud)

bdo*_*leu -1

重复查询是get_object_or_404().

如果你想从 URL 关键字参数中检索父对象,你可以将其设置为调度方法中的一个属性,该方法仅被调用一次,然后访问get_queryset().

from rest_framework.exceptions import NotFound

class PropertyPledgeList(generics.ListAPIView):
    queryset = PropertyPledge.objects.all()
    serializer_class = PledgeListSerializer

    def dispatch(self, request, *args, **kwargs):
        try:
            self.property = Property.objects.get(id=kwargs['slug'])
        except Property.DoesNotExist:
            self.property = None
        return super().dispatch(request, *args, **kwargs)

    def get_queryset(self):
        if not self.property:
            raise NotFound
        return self.property.get_pledges()
Run Code Online (Sandbox Code Playgroud)