Django定制经理不工作

时间:2015-01-21 13:32:12

标签: python django

基于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;没有定义。

我是新手,不明白为什么会这样:(

2 个答案:

答案 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_startdatetime.datetime.now().filter函数使用**kwargs,并将以下参数作为字典获取:

{
    'date_start__lt': datetime.datetime.now(),
    'date_end__gt': datetime.datetime.now(),
}

__lt__gtfield lookups,告诉查询集如何在数据库中执行比较。