Mysql 如何使用任意数量的OR子句形成Django查询?
我将Django 2.0与Python 3.7一起使用。如果字段在数组中至少包含一个字符串,我想编写一个返回结果的查询,因此我想设置OR查询。我试过这个Mysql 如何使用任意数量的OR子句形成Django查询?,mysql,sql,django,python-3.x,contains,Mysql,Sql,Django,Python 3.x,Contains,我将Django 2.0与Python 3.7一起使用。如果字段在数组中至少包含一个字符串,我想编写一个返回结果的查询,因此我想设置OR查询。我试过这个 class CoopManager(models.Manager): ... # Meant to look up coops case-insensitively by part of a type def contains_type(self, types_arr): queryset = Coop.
class CoopManager(models.Manager):
...
# Meant to look up coops case-insensitively by part of a type
def contains_type(self, types_arr):
queryset = Coop.objects.all()
for type in types_arr:
queryset = queryset.filter(type__name__icontains=type)
print(queryset.query)
return queryset
但是,这将生成一个将子句放在一起的查询。如何执行上述操作,但用OR而不是AND连接所有子句
我正在使用MySql 5.7,但我想知道一个独立于db的解决方案(如果有的话)。您可以创建一个
Q
对象来构造这个分离:
from django.db.models import Q
filter = Q(
*[('type__name__icontains', type) for type in types_arr],
_connector=Q.OR
)
queryset = Coop.objects.filter(filter)
从django.db.models导入Q
滤波器=Q(
*[('type\uuuu name\uuuu icontains',type)用于类型中的类型\u arr],
_连接器=Q或
)
queryset=Coop.objects.filter(filter)
这里的
filter
是一个Q
对象,它是所有type\uuuu name\uuuu icontains=type
过滤器的析取。感谢您的快速响应。我应该在我的问题中提到“types_arr”是一个字符串列表。您可能已经在回答中假设了这一点,但我在“queryset=Coop.objects.filter(filter)”行上得到了一个“AttributeError:'tuple'对象没有属性'split'”错误。@Dave:没有,我打错了,在列表理解之前有一个星号(*
)。