【问题标题】:Django - passing argument to custom .save methodDjango - 将参数传递给自定义 .save 方法
【发布时间】:2018-02-22 16:32:39
【问题描述】:

我的模型上有一个自定义的 .save 方法。该模型具有start_datelast_edited 值。如果这些值之间的差异超过 14 天,它应该在保存时复制/克隆自身(而不是保存)。

您可能已经看到了问题:无限递归。如果克隆保存了自己,值仍然会相差 14 天,整个复制过程将重新开始。

因此,我想在它们的 .save 参数中传递这些副本 'copy' 参数,以防止它们自己触发复制过程。

为此,我编写了以下代码:

def save(self, *args, **kwargs):

    #check if a submission is older than the 'create a new one' threshold
    #Create a new one if that is the case

    delta = self.last_edited - self.start_date

    print(args)
    print(kwargs)

    if 'copy' in kwargs or 'copy' not in args:
        print('cloning!')

        if delta.days >= 14:

            clone = self
            clone.pk = None
            clone.save('copy')

    super(AssessmentSubmission, self).save(*args, **kwargs)

但是,由于某种原因,clone.save(copy) 没有将“复制”变量传递给 .save 方法。我什至添加了一些打印语句来打印所有argskwarg 参数,但都返回空列表/字典。

有谁知道我做错了什么?

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    为什么不在模型中设置一个标志字段?比*kwargs**args 更干净。比如:

    class AssessmentSubmission(models.Model):
        '''
        Your other fields here
        '''
        flag_field = models.IntegerField(default=0,blank=True,null=True)
    
        def save(self):
    
        #check if a submission is older than the 'create a new one' threshold
        #Create a new one if that is the case
    
        delta = self.last_edited - self.start_date
    
        print(args)
        print(kwargs)
    
        if not self.flag_field:
            print('cloning!')
    
            if delta.days >= 14:
    
                clone = self
                clone.pk = None
                clone.flag_field = 1
                clone.save('copy')
    
        super(AssessmentSubmission, self).save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-24
      • 2010-11-15
      • 2010-10-12
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多