Переопределить сохранение в Django, вызывая бесконечную ошибку рекурсии - PullRequest
0 голосов
/ 20 сентября 2018

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

Я пытаюсь переопределить метод save() Django для публикации нескольких экземпляров при создании одного экземпляра.У меня есть цикл, который изменяет unique_id, который я сохранил как случайно сгенерированную строку, и значение datetime, которое обновляется с помощью другой функции под названием 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

Как всегда, любая помощь очень ценится.

1 Ответ

0 голосов
/ 21 сентября 2018

Вы должны позвонить super(Bookings, self).save(*args, **kwargs) вместо self.save().Супер-сохранение вызовет фактическое сохранение модели Django, то есть то, что вы хотите.Вызов self.save() просто вызовет ваше переопределенное сохранение, которое ничего не делает в базе данных.Но то, что сказал @AamirAdnan, должно решить твою проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...