2011-05-08 93 views
0

我有一些日期在Django筛选,我只是不能看到有什么问题。Django日期筛选器奇怪

我有这个领域的典范:

date_of_birth = models.DateField(blank = True, null=True, auto_now=False, auto_now_add=False) 

我再选择的所有数据

users = UserDetails.objects.all() 

我在数据库中有2行和两个对象返回

>>> users 
[<UserDetails: UserDetails object>, <UserDetails: UserDetails object>] 

>>> users[0] 
<UserDetails: UserDetails object> 

我可以看到每个对象的date_of_birth值

>>> users[0].date_of_birth 
datetime.date(1971, 9, 28) 

但是我尝试的任何过滤器总是失败?

>>> users = users.filter(date_of_birth__year >= 1970) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
NameError: name 'date_of_birth__year' is not defined 

>>> users = users.filter(date_of_birth == datetime.date(1971, 9, 28)) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
NameError: name 'date_of_birth' is not defined 

>>> users = users.filter(date_of_birth == '1971-09-28') 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
NameError: name 'date_of_birth' is not defined 

任何人都可以帮助解释这里有什么问题吗?
我不知所措。

谢谢。

+0

精氨酸..有两个'=='打破它。抱歉! – Jacob 2011-05-08 15:35:10

回答

3

您不使用比较运算符进行过滤。你在做什么实际上是将关键字参数传递给filter方法。要根据平等筛选,简单地做:

users = users.filter(date_of_birth=datetime.date(1971, 9, 28)) 

要过滤使用大于或等于,使用方法:

users = users.filter(date_of_birth__year__gte=1970) 

也就是说,你追加__gte的关键字参数。

您也可以过滤小于或等于(date_of_birth__year__lte),小于(date_of_birth__year__lt)或大于(date_of_birth__year__gt)。

+0

在Django 1.4中,使用'__lt','__gt'等不能和'__year','__month'和'__day'一起使用。有一张用于添加该功能的票证:[link](https://code.djangoproject.com/ticket/10911)。 – dhobbs 2012-10-26 17:27:40