Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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
Django 带有IN+;喜欢_Django_Django Models - Fatal编程技术网

Django 带有IN+;喜欢

Django 带有IN+;喜欢,django,django-models,Django,Django Models,让我们假设以下模型: 班级人员(models.Model): name=models.CharField(null=False) ... 我知道我可以使用Person.objects.filter(name_uucontains='a')对包含字母a的姓名进行筛选Persons。我知道我可以使用Person.objects.filter(name_uuin=['John Doe','Mary Jane'])过滤列表中名为的人员 使用一个过滤器就可以完成这两件事(或者,执行方式是什么) 我知道我

让我们假设以下模型:

班级人员(models.Model):
name=models.CharField(null=False)
...
我知道我可以使用
Person.objects.filter(name_uucontains='a')
对包含字母
a
的姓名进行筛选
Persons
。我知道我可以使用
Person.objects.filter(name_uuin=['John Doe','Mary Jane'])过滤列表中名为的
人员

使用一个过滤器就可以完成这两件事(或者,执行方式是什么)


我知道我可以做2次查询(可能更多)并获取数据。但是在我当前的例子中,我在视图中有一个名为
get\u filters
的方法,它返回一个
Q
对象,该对象将在
get\u queryset
方法中使用。所以我需要在
Q
对象中实现这一点,并且只获取一个查询。这是可能的?

正如您所想,您可以构建一个
Q()
过滤器对象

Q(name__contains='a') & Q(name__in=['John Doe', 'Mary Jane'])
但是,这只会匹配对象
Mary Jane
,因为
John Doe
不包含
a
。(等效的SQL是像“%a%”一样的
名称和中的名称('John Doe','Mary Jane')

如果您的意思是“查找包含这些子字符串的任何对象”,那么也有可能:

q = Q()
for substring in ['John', 'Mary', 'Jane']:
  q |= Q(name__contains=substring)

这将相当于像“%John%”这样的
名称或像“%Mary%”这样的名称或像“%Jane%”这样的名称

正如您所想象的,您可以构建一个
Q()
过滤器对象

Q(name__contains='a') & Q(name__in=['John Doe', 'Mary Jane'])
但是,这只会匹配对象
Mary Jane
,因为
John Doe
不包含
a
(等效的SQL是
名称,如“%a%”,以及名称IN('John Doe',Mary Jane')

如果您的意思是“查找包含这些子字符串的任何对象”,那么也有可能:

q = Q()
for substring in ['John', 'Mary', 'Jane']:
  q |= Q(name__contains=substring)
这将相当于
名称,如“%John%”,或名称,如“%Mary%”,或名称,如“%Jane%”

是的,我想做的是“查找包含这些子字符串的任何对象”,也许我表达得不好,但这个for循环解决了问题!是的,我想做的是“查找包含这些子字符串的任何对象”,也许我没有很好地表达自己,但这个for循环解决了这个问题!