Django .filter在同一选项上有多种可能性

时间:2011-04-25 21:38:28

标签: django filter

我有一个对象模型。我还有一个用于过滤结果的选项列表。我不确定是否有一种简单的方法来过滤模型中的对象,以便返回与过滤器列表中的任何项匹配的任何对象。例如:

# returns all users with name starting with 'P'
usersWithPName = User.objects.filter(name__startswith = 'P')
# 3 letters to filter User model with
filterList = ['P', 'T', 'R'] 
# ideally would return all users with name starting with either 'P', 'T', or 'R'
usersWithPTRName = User.objects.filter(name__startswith = filterList) 

有没有办法过滤(在这种情况下)User模型,以便返回与filterList中任何一个项匹配的任何对象?

2 个答案:

答案 0 :(得分:20)

可以使用Q objects

完成此操作
from django.db.models import Q
usersWithPTRName = User.objects.filter(Q(name__startswith='P') |
                                       Q(name__startswith='T') |
                                       Q(name__startswith='R')) 

您还可以在运行时构建Q过滤器:

filterList = ['P', 'T', 'R']
query = Q()
for letter in filterList:
    query = query | Q(name__startswith=letter)
usersWithPTRName = User.objects.filter(query)

答案 1 :(得分:0)

两种选择。

  1. 在模型中包含第一个字母作为属性。

  2. 使用更高级的查询。

  3. 你可以这样做

    class User( models.Model ):
        ... all the usual stuff ...
        @property
        def first_letter( self ):
            return self.name[:1]
    

    现在可以使用filter( first_letter__in=('P','T','R') )

    进行过滤

    第二种选择是为您的过滤器构建Django Q对象。

    从这里开始:https://stackoverflow.com/search?q=django+Q+objects