Django 保存覆盖抛出主要重复错误



所以,我有一个名为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)

这将引发主键错误。我得到第二个超级(计划项,自我)的重复条目。我一生都无法弄清楚如何检查 pk 以访问日期时间值,然后在保存覆盖方法中再次保存。我尝试过移动东西,我尝试在 get_total_hours() 函数中保存,除了麻烦之外什么都没有。

我只想将对象提交到 db,以便我可以获取日期时间对象,然后计算总小时数。

我宁愿不在保存函数中转换为日期时间。

有没有人有任何提示,或者谁能告诉我哪里出错了?

你不应该把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 强制插入。

相关内容

  • 没有找到相关文章

最新更新