django objects.filter Q() 在一个查询中可以使用多少次?

Posted

技术标签:

【中文标题】django objects.filter Q() 在一个查询中可以使用多少次?【英文标题】:How many time can django objects.filter Q() be used in one query? 【发布时间】:2014-12-05 02:29:30 【问题描述】:

鉴于我的用户表有大量用户名可以以数字或字母开头,我如何才能获得名称以 A 到 Z 开头的用户?

我尝试了以下方法,但没有成功。

users = User.objects.filter(reduce(operator.or_, [Q(name__startswith=letter) for letter in 'ABCDEFGHIJKLMNOPQRSTUVWXYZ']))

但是,如果我尝试以下方法,它会起作用

users = User.objects.filter(reduce(operator.or_, [Q(name__startswith=letter) for letter in 'ABCDEFGHI']))

似乎 Q() 在 objects.filter 中被限制为 9 次。您能否提一些建议?谢谢!

【问题讨论】:

当你说第一个没有工作时,它是否抛出了一些错误? 【参考方案1】:

你为什么不使用Regex filter?

users = User.objects.filter(name__iregex=r'^[A-Z]')
for user in users:
    print user.name

这是我刚刚在本地测试 django 项目中尝试的方法: 刚刚创建了一个模型:

from django.db import models

class Users(models.Model):
    name = models.CharField(max_length=50)

运行 django manage.py shell 命令,导入此模型,并创建 3 个用户:

>>>Users.objects.create(name="FirstUser").save()
>>>Users.objects.create(name="SecondUser").save()
>>>Users.objects.create(name="12NumberedUser").save()

>>> for i in Users.objects.filter(name__iregex=r'^[A-Z]'):
...     print i.name
...
FirstUser
SecondUser
>>>

另外,Q 也一样,但如果只有一个条件,就不需要Q

希望对您有所帮助。

【讨论】:

以上是关于django objects.filter Q() 在一个查询中可以使用多少次?的主要内容,如果未能解决你的问题,请参考以下文章

django:使用 Q 对象

Django查找数据库objects.filter() 和 排序order_by 和 Q()与或非 和 F()属性之间比较 的用法

django-model之Q查询补充

django中的F和Q

Django SQL OR via filter() & Q(): 动态?

在Django中组合Q对象并限制其中之一