是否可以只在一个中混合多个请求?

时间:2013-07-10 13:07:00

标签: python django django-rest-framework

我已经问了这个问题,但是没有人回答。我会再次问它,因为我很确定这个问题很容易被Django中比我更了解的人(我什么都不知道)解决。我有一个搜索工具。当我使用它时,它会搜索我的五个Django模型,从而向我的REST API发送五个GET请求。令人讨厌的是它在我的控制台中显示五个请求。有没有办法“混合”这五个请求,只显示一个请求?或者,有没有办法在几个模型上做单个请求?请教我。

编辑:执行查询的我的一个视图示例:

class ProjectList(generics.ListCreateAPIView):
    serializer_class = ProjectSerializer #My serializer

    def get_queryset(self):
        queryset = Project.objects.filter(user=self.request.user)
        query = self.request.QUERY_PARAMS.get('query', None)
        # Perf enhancements :
        queryset = queryset.prefetch_related('user', 'tasks')
        # ---
        if query is not None:
            queryset = queryset.filter(
                Q(name__icontains=query) |
                Q(created_on__icontains=query)).order_by('name')

        return queryset

    def pre_save(self, obj):
        obj.user = self.request.user #This links the project to an user
                            #Don't think it's useful here but anyway

我还有四个查询视图,每个模型一个。他们都是这样的,所以我认为发布它们并不重要。

这些查询是在我的javascript文件中进行的(我正在使用angularjs),如下所示:

this.doSearch = function(query) {
    if (query.length > 2) {
        this.searchengine.projects = $resource('/api/projects').get({query: query});
        this.searchengine.tasks = $resource('/api/tasks').get({query: query});
        this.searchengine.comments = $resource('/api/comments').get({query: query});
    }
}

1 个答案:

答案 0 :(得分:0)

您可以为搜索创建一个新的端点,返回多种类型的对象:

class SearchView(APIView):

    def get(self, request, format=None):
        data = []

        queryset = Project.objects.filter(user=request.user)
        query = self.request.QUERY_PARAMS.get('query', None)
        queryset = queryset.filter(
                Q(name__icontains=query) |
                Q(created_on__icontains=query)).order_by('name')
        serializer = ProjectSerializer(queryset, many=True)
        data.extend(serializer.data)
        #do the same for other types of objects

        return Response(data)