Как мне создать собственные отношения в полиморфном наследовании в эликсире и пилонах? - PullRequest
0 голосов
/ 17 марта 2010

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

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

Итак:

  • У Nav есть «section» (OneToMany) и «before» (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: (навигация таблицы) не имеет столбца с именем 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 Ответ

0 голосов
/ 19 марта 2010

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

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 выглядит правильно для меня. Поэтому остается только то, что схема базы данных не отражает объектную модель. Можете ли вы воссоздать модель БД? Или хотя бы опубликовать итоговые сценарии БД?

...