我正在为使用自定义权限处理的现有系统开发REST API。我正在尝试使用Django REST Framework中的内置泛型,但是我在使用自定义权限过滤列表视图时遇到了麻烦。我当前观点的一个例子是:
class WidgetList(generics.ListCreateAPIView):
permission_classes = (permissions.IsAuthenticated,)
model = Widget
serializer_class = WidgetSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('widget_type', 'widget_owner')
def get_queryset(self):
"""
Overwrite the query set to check permissions
"""
qs_list = [w.id for w in self.model.objects.all() if
canReadWidget(self.request.user, w)]
return self.model.objects.filter(id__in=qs_list)
这有效,但我觉得可以改进get_queryset函数。因为我的canReadWidget是自定义的,所以我必须评估self.model.objects.all()
并检查用户可以读取哪些小部件,但该函数必须返回一个查询集,因此我使用id__in=qs_list
部分。结果是我为一个列表提取做了两个数据库调用。
是否有一种标准的方法来处理通用列表视图的这种每对象过滤?
答案 0 :(得分:1)
在某些时候,最好删除默认的通用视图或功能并自行滚动。
您应该查看ListModelMixin
并覆盖list
来处理列表,而不是将其转换为查询集。
你应该调整过滤和分页,但你不会像现在这样两次击中数据库。