合并__in并包含查询过滤器,以便在django中创建更复杂的过滤器

时间:2013-08-17 10:26:51

标签: python django filter django-queryset

所以这是我的问题:
假设我有一些人的全名列表,我想过滤我的用户,以检查这些人中哪一个已经是我的用户。

问题是用户有名字和姓氏,但我所拥有的是全名列表,意思是'first_name + last_name'。

我试图过滤3个步骤,首先过滤所有用户的first_names在列表中的位置,然后用他们的last_name过滤。第三步是检查结果之间的确切匹配,但问题是我可以' t使用列表中的first_name过滤我的用户,因为__in运算符会查找完全匹配而不是部分匹配 的所以
无论如何都要做这样的过滤器:

users.filter(first_name__in__icontains=list_of_people)   

甚至更好,我可以使用像:

这样的过滤器
users.filter((first_name+ ' ' + last_name)__in=list_of_people)


任何帮助将不胜感激:)
 感谢

1 个答案:

答案 0 :(得分:2)

对我来说似乎不可能使用普通的查询集,我猜你需要遍历列表并找到匹配项,例如:

from django.db.models import Q     

qs = User.objects.all()
for fullname in list_of_names:
    firstname, lastname = fullname.split()
    qs = qs.filter(
        Q(first_name__icontains = firstname), 
        Q(last_name__icontains = lastname)
    )

另一种选择是使用raw query,对于这种情况可以没问题,查询将是这样的:

SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) IN (list_of_name)

但这不是不区分大小写的,你应该尽量避免原始查询。