LINUX.ORG.RU

sqlalchemy relationship Circular dependency detected


0

1

как правильно связать таблицы?

class Domen(db.Model):
    __tablename__ = 'domen'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(255))
    pages = db.relationship('Page', lazy = 'dynamic')
    default_page_id  = db.Column(db.Integer, db.ForeignKey('page.id'), default=0 )

class Page(db.Model):
    __tablename__ = 'page'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(255))
    domen_id  = db.Column(db.Integer, db.ForeignKey(D.id), default=0 )
    domen = db.relationship('Domen', foreign_keys=domen_id)
таблица страниц иметь внешний ключ в таблице доменов, при этом записи из таблицы доменов может иметь внешний ключ в таблице страниц

вроде простая штука, но sqlalchemy просто упорола уже

★★

SQLAlchemy упорол, это да :-(

Но и архитектурно структура плоха. Из неё не следует, что domen.default_page_id не может ссылаться на page, у которой page.domen_id != domen.id.

Я бы сделал page.default (True/False) и тригером бы делал curent_default_page.default = False, при выставлении True у новой страницы. Здесь проблема с тем, что из структуры не очевидно, что default = True может быть только у одной page для domen. Но проблема менее существенна.

P.S.: почему «title», но «domen» а не «domain»?

Y ★★
()

так может это many-to-many relationship и нужно делать промежуточную таблицу?

anonymous
()
Ответ на: комментарий от Y

хм, в принципе domen.default_page может быть и несколько, там даже лучше будет

твоя мысль понятна, но согласись, не интуитивное действие: чтобы поменять структуру сайта нужно лазать по списку страниц и менять их свойства, логичнее зайти в модель сайта и от туда привязать нужные к главной.

как то без ORM это ведь элементарно делается

fMad ★★
() автор топика
Ответ на: комментарий от fMad

не интуитивное действие

Согласен. Но интерфейс ведь можно и нужно реализовать так, как интуитивнее.

без ORM это ведь элементарно делается

Вроде SQLAlchemy не запрещает делать такие модели, он запрещает создавать такие записи в таких таблицах, которые в результате будут по кругу ссылаться сами на себя. Возможно, это связано с тем, как он их разворачивает в питоний объект.

Y ★★
()
Последнее исправление: Y (всего исправлений: 1)
Ответ на: комментарий от fMad

Не уверен, что это может быть предусмотрено SQLAlchemy. Думаю, стоит почитать доку и заглянуть в сорцы, может там одним условием или простой обёрткой всё решится.

Хотя, я бы изменил структуру.

Y ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.