Django过滤器对多列值的“组合”查询集
说我有一个模型:Class Person(models.Model):
firstname = models.CharField()
lastname = models.CharField()
birthday = models.DateField()
# etc...
并说我有2个姓氏列表:first_list = ['Bob', 'Rob']我有2个姓氏列表:last_list = ['Williams',
'Williamson']。然后,如果我想选择名字在其中的每个人,first_list我可以运行:
Person.objects.filter(firstname__in=first_list)
如果我想选择姓氏在的所有人last_list,我可以这样做:
Person.objects.filter(lastname__in=last_list)
到目前为止,一切都很好。如果我想同时运行这两个限制,那很容易…
Person.objects.filter(firstname__in=first_list, lastname__in=last_list)
如果我想进行or样式搜索而不是and样式搜索,则可以使用Q对象:
Person.objects.filter(Q(firstname__in=first_list) | Q(lastname__in=last_name))
但是我的想法有些微妙。如果我只想返回一个返回名字和姓氏特定组合的查询集怎么办?即我想返回in中的Person对象。也就是说,我想找回叫鲍勃·威廉姆斯或罗伯·威廉姆森的人(但不要叫鲍勃·威廉姆森或罗伯·威廉姆斯的人)。
(Person.firstname, Person.lastname)``zip(first_names, last_names)
在我的实际使用情况,first_list并last_list就都有?100元。
目前,我需要在Django应用中解决此问题。但是我也对在更通用的SQL上下文中处理此问题的最佳方法感到好奇。
谢谢!(并且请让我知道是否可以澄清任何事情。)
解决方案:
除了一个大的OR子句,我看不到很多解决方案:
import operator
from itertools import izip
query = reduce(
operator.or_,
(Q(firstname=fn, lastname=ln) for fn, ln in izip(first_list, last_list))
)
Person.objects.filter(query)
页:
[1]