2012-03-12 87 views
12

所以我想找到任何匹配给出了一些领域,因此,例如,这是我想要做什么:与__in查找Django的icontains

possible_merchants = ["amazon", "web", "services"] 
# Possible name --> "Amazon Service" 
Companies.objects.filter(name__icontains__in=possible_merchants) 

可惜这是不可能的混合icontains和__in查找。

这似乎是一个相当复杂的查询,所以如果我至少可以忽略的情况下,这将是足够的,例如名称:

Companies.objects.filter(name__ignorecase__in=possible_merchants) 

任何想法?

PD:我张贴的查询不工作,它只是一个表达我需要什么(以防万一嘿嘿)

+1

http://stackoverflow.com/questions/3923589/django-in-lowercase – 2012-03-12 21:04:45

回答

22

您可以创建查询集with the Q constructor,并与|运营商结合他们得到他们结合的方式:

from django.db.models import Q 

def companies_matching(merchants): 
    """ 
    Return a queryset for companies whose names contain case-insensitive 
    matches for any of the `merchants`. 
    """ 
    q = Q() 
    for merchant in merchants: 
     q |= Q(name__icontains = merchant) 
    return Companies.objects.filter(q) 

(而同样与iexact代替icontains

+1

WAO似乎是一个非常干净的AP proach,让我试试吧 – Hassek 2012-03-12 21:18:45

+1

很好的答案,谢谢! – Hassek 2012-03-12 21:39:11

+5

如果任何人需要动态字段名称,请使用'q | = Q(** {'%s__icontains'%field_name:merchant})' – 2014-02-27 02:02:30

相关问题