Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用任意数量的OR子句形成Django查询?_Mysql_Sql_Django_Python 3.x_Contains - Fatal编程技术网

Mysql 如何使用任意数量的OR子句形成Django查询?

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.

我将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.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:没有,我打错了,在列表理解之前有一个星号(
*
)。