【问题标题】: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()