覆盖保存,保存另一个实例

时间:2016-01-20 14:56:55

标签: django

我有时间日志条目,当我保存条目时,我想自动将之前记录的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中运行类似的代码时,它可以工作。

1 个答案:

答案 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()