覆盖Django中的保存导致无限递归错误

时间:2018-09-19 21:39:51

标签: python django django-models django-rest-framework

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

我试图覆盖Django的save()方法,以在创建单个实例时发布多个实例。我有一个循环,它会更改保存为随机生成的字符串的unique_id,以及通过另一个名为onDay()的函数更新的datetime值。

我的想法是,如果每次循环时都更改unique_id,Django会将实例另存为数据库中的新实例。但是,尽管我运行它时仍然不断返回无限递归错误。当我用pdb.set_trace()进行检查时,一切都会按照预期进行,直到在for循环中达到save()值为止。一旦发生这种情况,我就回到第if self.recurrent_type == "WEEKLY":行。

我以类似的方式(无循环)使用super()来覆盖save()函数以用于单独的模型,并且它按预期工作。我想我对super()函数有误解。

这是我到目前为止所拥有的:

覆盖save()

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)

onDay()

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

一如既往,我们将不胜感激。

1 个答案:

答案 0 :(得分:1)

您应该致电super(Bookings, self).save(*args, **kwargs)而不是self.save()。超级保存将调用django的实际模型保存,这就是您想要的。调用self.save()只会调用您的覆盖保存,这对数据库没有任何作用。但是,@ AamirAdnan所说的应该可以解决您的问题。