(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
Как всегда, любая помощь очень ценится.