所以,我有一个名为ScheduleItem的模型
class ScheduleItem(models.Model):
agreement = FK
location = FK
start = models.DateTimeField()
end = models.DateTimeField()
totalHours = DecimalField
def get_total_hours(self):
start = timedelta(hours=self.start.hour, minutes=self.start.minute)
end = timedelta(hours=self.end.hour, minutes=self.end.minute)
td = (end-start).seconds
totalHours=Decimal(td/Decimal(60)/Decimal(60))
return totalHours
def save(self,*args,**kwargs):
if self.pk == None:
super(ScheduleItem,self).save(self,*args,**kwargs)
self.refresh_from_db() # to access the datetime values, rather than unicode POST
self.totalHours = self.get_total_hours()
else:
self.totalHours = self.get_total_hours()
super(ScheduleItem,self).save(self,*args,**kwargs)
这会引发PRIMARY键错误。我得到第二个super(ScheduleItem,self)的重复条目。我不能为我的生活弄清楚如何检查pk以访问datetime值,然后再次保存在保存覆盖方法中。我已经尝试过移动,我尝试在get_total_hours()函数中保存,只有麻烦。
我只想将对象提交给db,这样我就可以获取datetime对象,然后计算总小时数。
我宁愿不在保存功能中转换为日期时间。
有没有人有任何提示或有人能告诉我哪里出错了?
答案 0 :(得分:5)
您不应将self
传递给save()
。您正在调用super().save()
作为实例的绑定方法,因此self
将作为第一个参数隐式传递。将其更改为:
def save(self,*args,**kwargs):
if self.pk is None:
super(ScheduleItem,self).save(*args,**kwargs)
self.refresh_from_db() # to access the datetime values, rather than unicode POST
self.totalHours = self.get_total_hours()
else:
self.totalHours = self.get_total_hours()
super(ScheduleItem,self).save(*args,**kwargs)
您得到这种奇怪的行为,因为第一个位置参数是force_insert
,模型实例的计算结果为True
。对super().save()
的第二次调用尝试强制使用您之前保存的相同pk插入。