我正在创建一个用于记录用户任务的时间表应用程序。这是Timesheet
型号:
class Timesheet(models.Model):
date = models.ForeignKey(
'Attendance',
on_delete=models.CASCADE
)
start_time = models.TimeField()
duration = models.DurationField()
task = models.CharField(max_length=20)
在创建了几个任务之后,我需要一种通过PUT请求更新任务的方法。问题是,一个任务的start_time
取决于先前任务的start_time
和duration
。因此,如果我想更改一个任务的duration
,我需要更改它之后所有任务的start_time
我该如何做到这一点?我目前正在为TimesheetDetail
视图使用通用视图类RetrieveUpdateDestroyAPIView
。我应该重写put()
还是update()
方法?
我遵循@Klim Bim最初的建议,决定覆盖时间表模型中的save()
方法,因为我希望确保每次创建/更新时的一致性。
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
queryset = Timesheet.objects.filter(
date=self.date,
start_time__gt=self.start_time
).order_by('start_time')
corrected_time = (
datetime.combine(date.today(), self.start_time) + self.duration
).time()
for obj in queryset:
obj.time = corrected_time
corrected_time = (
datetime.combine(date.today(), obj.start_time) + obj.duration
).time()
super(Timesheet, obj).save()