Как мне создать собственные отношения в полиморфном наследовании в эликсире и пилонах?

Я новичок в программировании и следую примеру в документации Pylons по созданию Wiki. База данных, которую я хочу связать с вики, была создана с помощью Elixir, поэтому я переписал схему базы данных вики и продолжил оттуда.

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

Так:

  • Nav имеет "раздел" (OneToMany) и "до" (OneToOne - для ссылки на предыдущий узел)
  • Страница имеет "раздел" (ManyToOne - много страниц в одном разделе) и наследует "до"
  • Раздел наследует все от Nav

Код, который я написал, выглядит так:

class Nav(Entity):
    using_options(inheritance='multi')
    name = Field(Unicode(30), default=u'Untitled Node')
    path = Field(Unicode(255), default=u'')
    section = OneToMany('Page', inverse='section')
    after = OneToOne('Nav', inverse='before')
    before = OneToMany('Nav', inverse='after')

class Page(Nav):
    using_options(inheritance='multi')
    content = Field(UnicodeText, nullable=False)
    posted = Field(DateTime, default=now())
    title = Field(Unicode(255), default=u'Untitled Page')
    heading = Field(Unicode(255))
    tags = ManyToMany('Tag')
    comments = OneToMany('Comment')
    section = ManyToOne('Nav', inverse='section')

class Section(Nav):
    using_options(inheritance='multi')

Ошибки, полученные на этом:

sqlalchemy.exc.OperationalError: (OperationalError) таблица nav не имеет столбца с именем aftr_id u'INSERT INTO nav (имя, путь, aftr_id, row_type) VALUES (?,?,?,?)'

Я также попробовал:

   before = ManyToMany('Nav', inverse='before')

на Nav в надежде это может сломать проблему, но тоже нет.

Исходный код SQLAlchemy из учебника для этих объявлений выглядит следующим образом:

nav_table = schema.Table('nav', meta.metadata,
    schema.Column('id', types.Integer(), 
        schema.Sequence('nav_id_seq', optional=True), primary_key=True),
    schema.Column('name', types.Unicode(255), default=u'Untitled Node'),
    schema.Column('path', types.Unicode(255), default=u''),
    schema.Column('section', types.Integer(), schema.ForeignKey('nav.id')),
    schema.Column('before', types.Integer(), default=None),
    schema.Column('type', types.String(30), nullable=False)
)

page_table = schema.Table('page', meta.metadata,
    schema.Column('id', types.Integer, schema.ForeignKey('nav.id'), primary_key=True),
    schema.Column('content', types.Text(), nullable=False),
    schema.Column('posted', types.DateTime(), default=now),
    schema.Column('title', types.Unicode(255), default=u'Untitled Page'),
    schema.Column('heading', types.Unicode(255)),
)

section_table = sa.Table('section', meta.metadata, 
    schema.Column('id', types.Integer, 
        schema.ForeignKey('nav.id'), primary_key=True),
)

orm.mapper(Nav, nav_table, polymorphic_on=nav_table.c.type, polymorphic_identity='nav')
orm.mapper(Section, section_table, inherits=Nav, polymorphic_identity='section')
orm.mapper(Page, page_table, inherits=Nav, polymorphic_identity='page', properties={
    'comments':orm.relation(Comment, backref='page', cascade='all'),
    'tags':orm.relation(Tag, secondary=pagetag_table)
})

Буду признателен за любую оказанную помощь.

1 ответ

Я думаю, что ваша модель в основном правильная. Единственное, что я нашел, это ссылка section от Nav-> Страница и обратно:

class Nav(Entity):
    section = OneToMany('Page', inverse='section')
class Page(Nav):
    section = ManyToOne('Nav', inverse='section')

Учебник только что Section (не Page) это parent (учебный класс Nav), поэтому вы должны вместо этого иметь:

class Nav(Entity):
    section = ManyToOne('Section')
# and optionally inverse
class Section(Nav):
    children = ManyToOne('Nav')

В основном, чтобы прояснить модель, смотрите Section как Directory, где Page это как File, У них обоих есть a (parent) section и, предполагая, что они отсортированы каким-либо образом, также имеют before ссылка.

Часть с before а также after выглядит правильно для меня. Поэтому остается только то, что схема базы данных не отражает объектную модель. Можете ли вы воссоздать модель БД? Или, по крайней мере, опубликовать получившиеся сценарии БД?

Другие вопросы по тегам