如何在Django模型中连接查询集列表

时间:2020-03-31 02:11:53

标签: python django django-models

我有查询集列表,需要将它们连接成一个。

如何将查询集列表合并为一个?

class TagListAPIView(generics.ListAPIView):


    serializer_class = serializers.TagSerializer

    def get_queryset(self):

        search_words = self.request.query_params['search_with'].split()

        querysets = []
        for word in search_words:
            queryset = Tag.objects.filter(
                Q(name__contains = word)
            )
            querysets.append(queryset)

        return querysets # ListAPIView does not accept this

2 个答案:

答案 0 :(得分:0)

我认为我不漂亮,但我设法做到了。

class TagListAPIView(generics.ListAPIView):

    serializer_class = serializers.TagSerializer

    def get_queryset(self):

        search_words = self.request.query_params['search_with'].split()

        querysets = Tag.objects.none() # 1. Prepare empty queryset
        for word in search_words:
            queryset = Tag.objects.filter(
                Q(name__contains = word)
            )
            querysets = querysets.union(queryset) # 2. Use union

        return querysets

答案 1 :(得分:0)

使用__contains过滤器并传递可迭代的方法,而不是使用__in过滤器。这等效于SQL的IN关键字。有关Django here中不同字段查找的更多信息。

class TagListAPIView(generics.ListAPIView):
    serializer_class = serializers.TagSerializer

    def get_queryset(self):
        search_words = self.request.query_params['search_with'].split()
        queryset = Tag.objects.filter(name__in=search_words)

        return queryset

值得记住的是,Django中的查询集的行为与Python中的标准列表完全不同。有一个&|运算符可用于组合查询集,值得一读的here。就是说,当您发现自己想发明一种笨拙的解决方法来操纵查询集时,通常是个好兆头,该是时候深入研究文档以寻求更好的解决方案了。无论如何,这就是我的经验。