我有查询集列表,需要将它们连接成一个。
如何将查询集列表合并为一个?
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
答案 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。就是说,当您发现自己想发明一种笨拙的解决方法来操纵查询集时,通常是个好兆头,该是时候深入研究文档以寻求更好的解决方案了。无论如何,这就是我的经验。