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

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

(Django 2.0、Python 3.6、Django Rest 框架 3.8)

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

我的想法是,如果我改变了 unique_id每次我循环时,Django 都会将该实例保存为数据库中的一个新实例。但是,当我运行它时,我不断收到无限递归错误。当我用 pdb.set_trace() 检查时,一切都按预期进行,直到我点击 save() for 循环中的值。一旦发生这种情况,我就会被带回线路 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

与往常一样,非常感谢任何帮助。

最佳答案

您应该调用 super(Bookings, self).save(*args, **kwargs)而不是 self.save() . super 保存将调用 django 的实际模型保存,这正是您想要的。调用 self.save()只会调用您的覆盖保存,它不会在数据库中执行任何操作。但是,@AamirAdnan 所说的应该可以解决您的问题。

关于python - 覆盖 Django 中的保存导致无限递归错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52414550/

相关文章:

Python OpenCV 曲面图像转方形图像

regex - 高效的 Django QuerySet 正则表达式

python - Django : Foreign key set not found after saving object

sql - 使用 Django 的 ORM 进行复杂的 GROUP BY

python - django-rest-framework、多表模型继承、ModelSerializers 和嵌套序列化程序

python - 通过 pandas 数据框进行单向 Anova 循环 - 结果生成一个表

python - IronPython 中的 OpenFileDialog

python - Django 使用哪个数据库?

python - Django 通过多对多 ORM 对象中的多个标签进行过滤

python - Django 管理员无法使用自定义身份验证后端