我有一个对象模型。我还有一个用于过滤结果的选项列表。我不确定是否有一种简单的方法来过滤模型中的对象,以便返回与过滤器列表中的任何项匹配的任何对象。例如:
# 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中任何一个项匹配的任何对象?
答案 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)
两种选择。
在模型中包含第一个字母作为属性。
使用更高级的查询。
你可以这样做
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
对象。