如何过滤 Django ORM 上的查询

Ani*_*ozo 1 django orm

我知道这应该是非常基本的,但不知何故我不太明白。我想获取所有年龄小于 18 岁的用户,因此查询应该是这样的

User.objects.filter(age < 18)

我做错了什么?

Wil*_*sem 5

为了使用小于过滤器进行过滤,您可以使用__lt查找 [Django-doc]

User.objects.filter(age__lt=18)
Run Code Online (Sandbox Code Playgroud)

或者,如果您想过滤某些字段表达式的属性,您可以先注释:

from django.db.models import F

User.objects.annotate(
    age=F('age1') + F('age2')
).filter(age__lt=18)
Run Code Online (Sandbox Code Playgroud)

或者如果你想减去一个数字:

from django.db.models import F

User.objects.annotate(
    ageminus=F('age') - 5
).filter(ageminus__lt=18)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,User对象没有age字段,但有一个age1andage2字段。首先我们引入一个注解age,即这两个字段的总和。

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