【问题标题】:Django Rest Framework get_queryset being called more than onceDjango Rest Framework get_queryset 被多次调用
【发布时间】:2016-12-27 19:16:00
【问题描述】:

当向我的 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")

【问题讨论】:

    标签: django-rest-framework


    【解决方案1】:

    重复查询是get_object_or_404() 的结果。

    如果要从 URL 关键字参数中检索父对象,可以将其设置为 dispatch 方法中的属性,该方法仅调用一次,然后访问 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()
    

    【讨论】:

      最近更新 更多