在Django中,“>”,“<”,“>=”和“<=”无法与“filter()”一起使用。

257

使用下面的=,我可以通过age筛选人员:

qs = Person.objects.filter(age = 20)
                             # ↑ Here

但是下面的 >, <, >=, 和 <=,我无法使用 age 过滤人员:

qs = Person.objects.filter(age > 20)
                             # ↑ Here
qs = Person.objects.filter(age < 20)
                             # ↑ Here
qs = Person.objects.filter(age >= 20)
                             # ↑↑ Here
qs = Person.objects.filter(age <= 20)
                             # ↑↑ Here

然后,我遇到了以下错误:

NameError: name 'age' is not defined

在 Django 中如何使用 filter() 进行 大于(>)大于等于(>=)小于(<)小于等于(>=) 操作?


3
@BéresBotond 尽管文档看起来很棒,但结构和布局太差了,如果没有直接链接,它们几乎是无用的。 - RunLoop
@BéresBotond 很遗憾,该链接现在已经失效了 :( - dKen
文档的有效链接:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#gt - Gaurav Pandey
2个回答

509

大于:

Person.objects.filter(age__gt=20)

大于或等于:

Person.objects.filter(age__gte=20)

小于:

Person.objects.filter(age__lt=20)

小于或等于:

Person.objects.filter(age__lte=20)
你可以在 [文档] 中找到所有这些内容。(https://docs.djangoproject.com/en/stable/ref/models/querysets/)。)

2
哇,速度真快:)。这对于小于或等于非常有效,但是仅小于呢?(userprofile__level__lt=3)似乎不起作用。 - Finglish
1
它确实可以;但无论如何,您也可以使用exclude(__gte)代替filter(__lt)。 - lprsd
5
好的,我会尽力进行翻译。请注意,这句话的意思是不要忘记有两个下划线 __ - andilabs
我遇到了这个错误--> {FieldError}AutoField不支持查找“level”,或者不允许在该字段上进行连接。 - Aravind Pillai
问题,这里的=0是什么意思?假?真? - DeyaEldeen
1
请记得将 userprofile__level 更改为您的字段,例如 youtfield__lte。@AravindRPillai - christianbueno.1

0

在字段名age后面添加__gt后缀,表示“大于”:

Person.objects.filter(age__gt=20)
                    #    ↑↑↑↑ 
                    # age > 20

在字段名age后面添加__gte后缀表示“大于或等于”:

Person.objects.filter(age__gte=20)
                    #    ↑↑↑↑↑ 
                    # age >= 20

在字段名age后面添加__lt后缀,表示“小于”:

Person.objects.filter(age__lt=20)
                    #    ↑↑↑↑ 
                    # age < 20

在字段名age后面添加__lte后缀,表示“小于或等于”:

Person.objects.filter(age__lte=20)
                    #    ↑↑↑↑↑ 
                    # age <= 20

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接