刘加杰 发表于 2023-9-14 12:04:27

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]
查看完整版本: Django过滤器对多列值的“组合”查询集