У меня есть две модели sqlalchemy db, которые должны отражать двусторонние отношения один-к-одному.
Каждый раз, когда я пытаюсь присвоить связанный объект другому, объект возвращает ошибку: *** RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python
Двунаправленная связь создается через db.relationship с параметрами back_populations и uselist = False.
uselist = False упоминается в документации по SQLAlchemy для отношений один к одному.
Используемые версии:
Колба-SQLAlchemy == 2.3.2
SQLAlchemy == 1.2.14
Я пытался найти любую информацию, связанную с этим, однако ни в Google, ни на этом форуме я не смог найти что-то, что решило бы мою проблему.
Единственное решение, которое до сих пор работало, это удаление двунаправленных отношений, чтобы связанный объект был доступен только на одной стороне.
Кроме того, я попытался поиграться с настройками / переданными параметрами метода отношений, но ничего не улучшило поведение.
Модели базы данных:
########################################################
# Event Model
########################################################
class Event(db.Model):
"""Event: event entry, can either be the main object or a child. The difference
can be detected depending whether a parent_event_id exists or not. If the event
is recurring a recurring_pattern entry exists. """
__tablename__ = 'event'
id = db.Column(db.Integer, primary_key=True) #primary_key
... some declarations...
#relationship to recurring_pattern
recurring_pattern = db.relationship(
"Recurring_pattern",
back_populates="event", #do not populate back
uselist=False)
########################################################
# Shift_event Model
########################################################
class Recurring_pattern(db.Model):
"""recurring_pattern: is assigned 1:1 to event.
Stores recurring pattern of event..."""
__tablename__ = 'recurring_pattern'
id = db.Column(db.Integer, primary_key=True) #primary_key
#foreign_key: event_id
event_id = db.Column(db.Integer, db.ForeignKey('event.id'))
#relationship to event 1:1
event = db.relationship(
"Event",
back_populates="recurring_pattern")
Код, где происходит ошибка / назначены связанные объекты:
from app.models import Event, Recurring_pattern
...some code...
event = Event()
#set remaining parameters
event.org_id = org_id
event.event_title = event_title
event.event_description = event_description
event.start_date = start_date
event.end_date = end_date
event.duration_days = duration_days
event.duration_hours = duration_hours
event.duration_minutes = duration_minutes
event.shift_type = shift_type
event.break_time_hours = break_time_hours
event.break_time_minutes = break_time_minutes
event.is_full_day_event = is_full_day_event
event.is_recurring = is_recurring
event.created_by = self.user.get_email()
recurring_pattern = Recurring_pattern()
recurring_pattern.set_rrule(rrule_obj)
event.recurring_pattern = recurring_pattern
В момент, когда выполняется event.recurring_pattern = recurring_pattern, объект события содержит только:
*** RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python
Ожидаемым результатом будет присвоение событию recurring_pattern.
Сохранение / запись объекта в БД с ошибкой невозможна.
Любая помощь или подсказка, чтобы решить это высоко ценится!