Как объединить список наборов запросов в моделях django - PullRequest
0 голосов
/ 31 марта 2020

У меня есть список наборов запросов, и мне нужно соединить их в один.

Как объединить список наборов запросов в один?

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 голосов
/ 31 марта 2020

Вместо того, чтобы использовать фильтр __contains, используйте фильтр __in и передайте итерацию. Это эквивалент ключевого слова SQL IN. Подробнее о поиске в различных полях см. Django здесь .

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. Для объединения наборов запросов есть операторы & и |, о которых стоит прочитать здесь . Тем не менее, когда вы пытаетесь изобрести неуклюжий обходной путь для манипулирования набором запросов, обычно это хороший признак того, что пришло время покопаться в документации для лучшего решения. В любом случае, это был мой опыт.

0 голосов
/ 31 марта 2020

Не думаю, что я красивая, но мне как-то удалось это сделать.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...