基于this问题我写了这段代码:
class CourseManager(models.Manager):
def current(self):
return self.filter(date_start < datetime.datetime.now()).filter(date_end > datetime.datetime.now())
class PlannedCourse(models.Model):
course = models.ForeignKey(ECourse)
date_start = models.DateTimeField()
date_end = models.DateTimeField(blank=True)
...
objects = CourseManager()
def __str__(self):
return self.course.name + ' ' + self.date_start.strftime("%d-%m-%Y %H:%M") + ' - ' + self.date_end.strftime("%d-%m-%Y %H:%M")
但是当我尝试运行PlannedCourse.objects.current()
时,我收到错误:
NameError:name&#39; date_start&#39;没有定义。
我是新手,不明白为什么会这样:(
答案 0 :(得分:5)
您应该使用fields lookups:__gt
代替>
和__lt
代替<
:
class CourseManager(models.Manager):
def current(self):
return self.filter(date_start__lt=datetime.datetime.now(),
date_end__gt=datetime.datetime.now())
答案 1 :(得分:1)
您将未定义的python对象(date_start
)与python中的日期进行比较。但是,查询集的目标是比较数据库中的对象。即使定义了date_start
,这也相当于调用.filter(True)
或.filter(False)
。
要告诉Django签入数据库,您必须将关键字参数传递给ORM转换为查询的过滤器:
return self.filter(date_start__lt=datetime.datetime.now(),
date_end__gt=datetime.datetime.now())
请注意,您实际上并未实际比较date_start
和datetime.datetime.now()
,.filter
函数使用**kwargs
,并将以下参数作为字典获取:
{
'date_start__lt': datetime.datetime.now(),
'date_end__gt': datetime.datetime.now(),
}
__lt
和__gt
是field lookups,告诉查询集如何在数据库中执行比较。