Python 重写Django中的save,导致无限递归错误

Python 重写Django中的save,导致无限递归错误,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,(Django 2.0、Python 3.6、Django Rest Framework 3.8) 我试图重写Django的save()方法,以便在创建单个实例时发布多个实例。我有一个循环,可以更改保存为随机生成字符串的唯一\u id,以及通过另一个名为onDay()的函数更新的日期时间值 我的想法是,如果每次循环时都更改unique\u id,Django会将实例保存为数据库中的新实例。但是,当我运行它时,我不断返回一个无限递归错误。当我用pdb.set_trace()检查它时,所有操作都按照

(Django 2.0、Python 3.6、Django Rest Framework 3.8)

我试图重写Django的
save()
方法,以便在创建单个实例时发布多个实例。我有一个循环,可以更改保存为随机生成字符串的
唯一\u id
,以及通过另一个名为
onDay()
的函数更新的日期时间值

我的想法是,如果每次循环时都更改
unique\u id
,Django会将实例保存为数据库中的新实例。但是,当我运行它时,我不断返回一个无限递归错误。当我用
pdb.set_trace()
检查它时,所有操作都按照它应该做的进行,直到我在for循环中点击
save()
值。一旦发生这种情况,我就回到行
如果self.returnal\u type==“WEEKLY”:

我以类似的方式(没有循环)使用了
super()
,为一个单独的模型覆盖了
save()
函数,它按预期工作。我想我只是误解了
super()
函数

以下是我到目前为止的情况:

覆盖save()

onDay()


一如既往,我们非常感谢您的帮助。

您应该调用
super(预订,自助)。save(*args,**kwargs)
而不是
self.save()
。超级保存将调用django的实际模型保存,这正是您想要的。调用
self.save()。是的,@AamirAdnan所说的应该可以解决你的问题。

你在
函数中编写
self.save()
如果self.returnal\u type==“WEEKLY”
,那么你就在它的定义中调用了这个函数。由于
self.recurtive_type
从未更改(或其他确定循环的参数),这确实会导致无限递归。我明白了,感谢@WillemVanOnsem的输入,您知道我能做些什么来解决这个问题吗?我完全无法删除
self.save()
,如果self.recurrential\u type==“WEEKLY”
及其
else
,那么您应该调用
super(Bookings,self)。save(*args,**kwargs)
而不是
self.save()
。超级保存将调用django的实际模型保存,这正是您想要的。调用
self.save()。但是是的,@AamirAdnan说的应该可以解决你的问题。谢谢大家的帮助!我最终使用了@bdbd提供的解决方案(你能把你的解决方案作为答案发布给我吗?)。除了避免无限递归,我还犯了以下错误:(1)将变量保存为
self.id
,而它们本应是
self.unique\u id
(2)我没有增加我的计数器变量
RESET\u counter
(3)我应该在底部返回
None
,以避免重复保存
unique\u id
s。现在一切正常。
def save(self, *args, **kwargs):
        if not self.pk:  # if there is not yet a pk for it
            # import pdb; pdb.set_trace()
            if self.recurrent_type == "WEEKLY":
                LIST_OF_DAYS = self.days_if_recurring["days"]
                HOW_MANY_DAYS_FOR_ONE_WEEK = len(LIST_OF_DAYS)
                REPEATS = HOW_MANY_DAYS_FOR_ONE_WEEK * self.number_of_times_recurring
                RESET_COUNTER = 0
                for i in range(REPEATS):
                    self.id = ''.join(random.choices(string.ascii_letters, k=30))
                    self.calendarydays = onDay(self.calendarydays, LIST_OF_DAYS[RESET_COUNTER])
                    if RESET_COUNTER == HOW_MANY_DAYS_FOR_ONE_WEEK - 1:
                        RESET_COUNTER = 0
                    self.save()
            else:
                self.id = ''.join(random.choices(string.ascii_letters, k=30))
                self.save()
        return super(Bookings, self).save(*args, **kwargs)
def onDay(date, day):  # this function finds next day of week, and skips ahead one week if today's time has already passed
    utc = pytz.UTC
    check_right_now = utc.localize(datetime.datetime.now())
    if check_right_now > date:
        forward_day = date + datetime.timedelta(days=(day - date.weekday() + 7) % 7) + datetime.timedelta(days=7)
    else:
        forward_day = date + datetime.timedelta(days=(day - date.weekday() + 7) % 7)
    return forward_day