1

我已经问过这个问题,但没有人回答。我要再问一次,因为我很确定这个问题很容易被 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});
    }
}
4

1 回答 1

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)
于 2014-02-28T15:48:37.223 回答