使用自定义函数过滤Django查询集

时间:2016-02-29 17:23:25

标签: django django-rest-framework django-queryset

我正在为使用自定义权限处理的现有系统开发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部分。结果是我为一个列表提取做了两个数据库调用。

是否有一种标准的方法来处理通用列表视图的这种每对象过滤?

1 个答案:

答案 0 :(得分:1)

在某些时候,最好删除默认的通用视图或功能并自行滚动。

您应该查看ListModelMixin并覆盖list来处理列表,而不是将其转换为查询集。

你应该调整过滤和分页,但你不会像现在这样两次击中数据库。