代码之家  ›  专栏  ›  技术社区  ›  aalberti333

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

  •  0
  • aalberti333  · 技术社区  · 6 年前

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

    我在试着超越Django的 save() 方法在创建单个实例时发布多个实例。我有一个循环可以改变 unique_id onDay() .

    我的想法是,如果我改变 唯一\u id pdb.set_trace() for循环中的值。一旦发生这种情况,我就被带回到队伍里 if self.recurrent_type == "WEEKLY": .

    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)
    

    星期一()

    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 回复  |  直到 6 年前
        1
  •  2
  •   Brian Destura    6 年前

    你应该打电话 super(Bookings, self).save(*args, **kwargs) self.save() . 超级保存将调用django的实际模型保存,这正是您想要的。打电话 self.save()