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循环解决了这个问题!