我正在创建一个应用程序,您可以将任务分配给人。
class Task(models.Model):
TASK_CHOICES = (
('Task_1', 'Task_1'),
('Task_2', 'Task_2'),
('Task_3', 'Task_3'),
)
Person = models.ManyToManyField(Person, blank=True, null=True)
start_date = models.DateField(null=True, blank=True)
end_date = models.DateField(null=True, blank=True)
task = models.CharField(max_length=500, choices=TASK_CHOICES)
def __str__(self):
return '%s' % self.task
我的问题是:我怎样才能获得未分配给任何任务的第一个日期?
正如您所看到的,2013-10-16
未分配给任何任务,我希望得到该日期。
到目前为止,我试图做一些查询集。
filtered_tasks = Task.objects.filter(person='HereHere', start_date_gte='2013-10-10').order_by('start_date')
然后列出元组列表。
获得 date_tuples = [(d.start_date, d.end_date) for d in filtered_tasks]
:
[(datetime.datetime(2013,10,10), datetime.datetime(2013,10,15),
(datetime.datetime(2013,10,17), datetime.datetime(2013,10,23),
(datetime.datetime(2013,10,24), datetime.datetime(2013,10,31)
]
正如您所看到的,task2 start_date
和task1 end_date
之间存在差距。我被困在这里,我不知道如何告诉Python获取没有分配任务的日期(16.10)
。
答案 0 :(得分:1)
在计算机中使用日期时,最好使用closed-open notation。换句话说,第一个日期或日期时间是实际开始,但结尾被列为未包含在集合中的第一个日期时间。换句话说,您的数据可能如下所示:
function findPos(obj) {
var curtop = 0;
if (obj.offsetParent) {
do {
curtop += obj.offsetTop;
} while (obj = obj.offsetParent);
return [curtop];
}
}
一旦您的数据以完全开放的方式表示,那么您只需要获得结束日期的间隔减去开始日期:
data = [(datetime.datetime(2013,10,10), datetime.datetime(2013,10,16)),
(datetime.datetime(2013,10,17), datetime.datetime(2013,10,24)),
(datetime.datetime(2013,10,24), datetime.datetime(2013,11,1))
]
如果您不想更改为使用封闭式开启,只需检查超过1天的间隔,但这将开始导致您遇到麻烦。
如果您使用的是postgres 9.2+,您可能需要查看使用范围类型,因为它们可以在数据库中轻松完成这些操作。