如何筛选Django ORM上的查询

如何筛选Django ORM上的查询,django,orm,Django,Orm,我知道这应该是相当基本的,但不知怎么的,我不太明白。我想得到所有年龄小于18岁的用户,所以查询应该是这样的 User.objects.filter(年龄

我知道这应该是相当基本的,但不知怎么的,我不太明白。我想得到所有年龄小于18岁的用户,所以查询应该是这样的

User.objects.filter(年龄<18岁)

我做错了什么

要使用小于筛选器进行筛选,请使用:

User.objects.filter(年龄\uu lt=18)
或者,如果要对字段表达式的属性进行筛选,可以首先注释:

from django.db.models import F

User.objects.annotate(
    age=F('age1') + F('age2')
).filter(age__lt=18)
从django.db.models导入F
User.objects.annotate(
年龄=F('age1')+F('age2'))
).filter(年龄\uu lt=18)
或者,如果要减去一个数字:

from django.db.models import F

User.objects.annotate(
    ageminus=F('age') - 5
).filter(ageminus__lt=18)
从django.db.models导入F
User.objects.annotate(
ageminus=F(‘年龄’)-5
).filter(ageminus\uu lt=18)
在此示例中,
User
对象没有
age
字段,而是
age1
age2
字段。首先,我们引入注释
age
,即这两个字段的总和

通过编写
.filter(age<18)
,Python解释器将查找名为
age
的变量,如果该变量确实存在(不是per),那么它将与
18
进行比较,并将结果作为位置参数传递给
filter(…)
。因此,除非您使用某些代理对象(如SqlAlchemy),否则这将不起作用。

要使用小于的筛选器进行筛选,请使用:

User.objects.filter(年龄\uu lt=18)
或者,如果要对字段表达式的属性进行筛选,可以首先注释:

from django.db.models import F

User.objects.annotate(
    age=F('age1') + F('age2')
).filter(age__lt=18)
从django.db.models导入F
User.objects.annotate(
年龄=F('age1')+F('age2'))
).filter(年龄\uu lt=18)
或者,如果要减去一个数字:

from django.db.models import F

User.objects.annotate(
    ageminus=F('age') - 5
).filter(ageminus__lt=18)
从django.db.models导入F
User.objects.annotate(
ageminus=F(‘年龄’)-5
).filter(ageminus\uu lt=18)
在此示例中,
User
对象没有
age
字段,而是
age1
age2
字段。首先,我们引入注释
age
,即这两个字段的总和


通过编写
.filter(age<18)
,Python解释器将查找名为
age
的变量,如果该变量确实存在(不是per),那么它将与
18
进行比较,并将结果作为位置参数传递给
filter(…)
。因此,除非您使用一些代理对象,如SqlAlchemy,否则这将不起作用。

我简化了问题以使其更易于理解,但我可以在过滤器内执行操作吗?类似于用户((年龄-辅助)lt=18)?我需要知道年龄减去X的数字是否仍然<18@AnibalCardozo:然后你通常会做
.annotate(…)
s并对其进行过滤:我明白你的意思,annotate似乎是答案,但我仍然有一个问题,如果使用类似于User.objects.annotate(age-X<18)的属性,我会在使用时出错“名称'age'未定义”如果尝试Users.objects.annotate('age'-X<18),则会出现类似“不支持的操作数类型为-:'str'和'int'的错误”“@AnibalCardozo:但出于与筛选答案中所列相同的原因,您不能为注释执行此操作。有关如何注释的一些示例,请参见编辑后的答案。我为我的具体案例找到了一个解决方案,答案实际上要简单得多,而不是在过滤器内部执行操作,我可以在外部执行,类似这样的``real\u age=X+18 User.objects.filter(age\u lt=real\u age)“``我简化了这个问题,使它更容易理解,但我可以在过滤器内进行运算吗?类似于用户((年龄-辅助)lt=18)?我需要知道年龄减去X的数字是否仍然<18@AnibalCardozo:然后你通常会做
.annotate(…)
s并对其进行过滤:我明白你的意思,annotate似乎是答案,但我仍然有一个问题,如果使用类似于User.objects.annotate(age-X<18)的属性,我会在使用时出错“名称'age'未定义”如果尝试Users.objects.annotate('age'-X<18),则会出现类似“不支持的操作数类型为-:'str'和'int'的错误”“@AnibalCardozo:但出于与筛选答案中所列相同的原因,您不能为注释执行此操作。有关如何注释的一些示例,请参见编辑后的答案。我为我的具体案例找到了一个解决方案,答案实际上要简单得多,而不是在过滤器内部执行操作,我可以在外部执行,类似这样的``real\u age=X+18 User.objects.filter(age\u lt=real\u age)```