我有时间日志条目,当我保存条目时,我想自动将之前记录的end_time设置为编辑记录的start_time,因为不应有任何间隙。
class LogEntry(models.Model):
start_time = models.DateTimeField(null=True, blank=True)
end_time = models.DateTimeField(null=True, blank=True)
...
@property
def previous_entry(self):
user_previous_records = LogEntry.objects.filter(driver=self.driver, start_time__lt=self.start_time)
previous_entry = user_previous_records.latest('start_time')
return previous_entry
def save(self, *args, **kwargs):
print('checking previous entry, which is id %s' % self.previous_entry.id)
if self.previous_entry.end_time != self.start_time:
print('saving endtime of ' + str(self.previous_entry.id) + ' to ' + str(self.start_time))
self.previous_entry.end_time = self.start_time
self.previous_entry.save()
print('endtime of ' + str(self.previous_entry.id) + ' is now ' + str(self.previous_entry.end_time))
else:
print('previous end_time is the same as start_time')
super(LogEntry, self).save(*args, **kwargs)
发生的事情是前一个条目没有保存。这里有3个印刷语句,前2个印刷了预期的内容。 previous_entry
是正确的,并且它正确地说它将前一个条目的end_time设置为正确的start_time。
然而,在self.previous_entry.save()
行之后,下一个print语句表明记录没有得到更新(比如the endtime of 4 is now None
而不是更新的datetime对象,它说它正在保存它。
为什么这个保存不起作用的任何想法?我认为这与嵌套保存有关,但我找不到任何关于为什么不起作用的文档。当我在shell中运行类似的代码时,它可以工作。
答案 0 :(得分:1)
previous_entry
是计算属性。你不能像这样设置它的值。
你应该怎么做,是这样的:
previous_entry = LogEntry.objects.get(id=self.previous_entry.id)
self.previous_entry.end_time = self.start_time
self.previous_entry.save()