2016-06-14 132 views
0

我正在开发一个Django项目,并且必须进行一个查询,以返回当前处于活动状态的所有记录。查询必须为(开始日期,开始日期+时间)Django在开始日期和持续时间之间进行查询

我得到这个查询到目前为止之间,但我不知道如何查询开始日期+时间< datetime.now()

查看:

def home(request): 
    active_tasks = Task.objects.all().filter(start_time__lte=datetime.now()) 
    context = {'active_tasks' : active_tasks} 
    return render(request, "main/home.html", context) 

任务模式:

class Task(models.Model): 
    start_time = models.DateTimeField(default=datetime.now()) 
    duration = models.IntegerField(default=10) 
+1

有你存储的持续时间在你的模型,而不是一个结束时间,一个很好的理由?结束时间将更容易查询。如果您需要在某处显示它,则仍然可以将持续时间作为计算属性。 – solarissmoke

+0

他可以以某种方式使用django注释,例如postgresql有很多额外的日期时间功能,所以像这样:http://stackoverflow.com/questions/8432926/aggregate-difference-between-datetime-fields-in-djano将是可能的。但我认为它的过度杀伤 –

+0

我使用了一段时间,因为它更容易填写表单,然后每次填入结束日期。而任务只需要几分钟。 –

回答

1

你的代码中有几个缺陷。首先,我们不清楚duration有几天,几个月,几年,几分钟?

我假设您使用的是天,但您无法查询,因为您需要将start_time + duration转换为datetime,并将其视为每条记录的结束时间,这在单个查询中是不可能的。正如@solarissmoke提到的,您应该存储end_time。如果需要,您可以保留duration字段,但您也可以使用property method来计算它。

而且,你的字段定义start_time = models.DateTimeField(default=datetime.now())是行不通的,因为(加载模型时)的默认时间只会被评估的Django一次启动时。新django开发人员犯的错误是一个常见的错误。你应该将其更改为:

start_time = models.DateTimeField(default=datetime.now) 

这种情况下,datetime.now将被视为一个函数对象和被调用每次创建新的对象,这是你想要的时间。请注意,Django具有内置标志来执行此操作:auto_now_add

检查this SO answer on more detailed explanation.

+0

生病将datetime.now()更改为datetime.now。我使用持续时间的分钟。我选择这个,因为它更容易填写表格而不是结束日期。我知道它现在很难查询,但是没有解决方案吗? –

+0

正如我所说的,只需添加一个名为'end_time'的字段,所以当您保存模型时,从'start_time'和'duration'计算'end_time'并填写该字段。那有意义吗? –

+0

这很有道理。我会尽量实现这一点,首先我有一些其他的东西要做。我会回报。 –

相关问题