Полиморфные отношения SQLAlchemy с конкретным наследованием

Я использую наследование конкретной таблицы с SQLAlchemy. В классе модели декларативного стиля я успешно настроил его.

Мой код примерно такой:

class Entry(AbstractConcreteBase, db.Model):
    """Base Class of Entry."""

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    created = db.Column(db.DateTime, nullable=False)
    post_id = declared_attr(lambda c: db.Column(db.ForeignKey("post.id")))
    post = declared_attr(lambda c: db.relationship("Post", lazy="joined"))

    @declared_attr
    def __tablename__(cls):
        return cls.__name__.lower()

    @declared_attr
    def __mapper_args__(cls):
        # configurate subclasses about concrete table inheritance
        return {'polymorphic_identity': cls.__name__,
                'concrete': True} if cls.__name__ != "Entry" else {}

class TextEntry(Entry):
    """Text and Article Entry."""

    text = db.deferred(db.Column(db.Text, nullable=False))

class PhotoEntry(Entry):
    """Photo Entry."""

    path = db.deferred(db.Column(db.String(256), nullable=False))

Он отлично работает при тестировании в оболочке:

>>> from models.entry import Entry
>>>
>>> Entry.query.all()
[<PhotoEntry 'Title' created by tonyseek>,
 <PhotoEntry 'TITLE 2' created by tonyseek>,
 <PhotoEntry 'Title 3' created by tonyseek>,
 <PhotoEntry 'Title 4' created by tonyseek>,
 <TextEntry 'Title' created by tonyseek>]

Затем я попадаю в затруднительное положение при настройке взаимосвязи в других моделях. Каждая запись имеет внешний ключ post_id для соединения ] Модель сообщения , но я не смог определить обратную ссылку в сообщении . Это не может работать:

class Post(db.Model):
    """An Post."""

    id = db.Column(db.Integer, primary_key=True, nullable=False)
    description = db.Column(db.Unicode(140), nullable=False)
    entries = db.relationship(Entry, lazy="dynamic")

Это вызвало исключение и сообщило:

InvalidRequestError: сбой одного или нескольких сопоставителей для инициализации - невозможно продолжить инициализацию других сопоставителей. Исходное исключение: Класс 'models.entry.Entry' не сопоставлен.

Очевидно, что Entry является абстрактным классом, который не может быть сопоставленным с реальной существующей таблицей. В документе на официальном веб-сайте есть пример, но его базовый класс не является абстрактным. Теперь, как мне сделать, чтобы установить полиморфные отношения? ip с абстрактной моделью?

5
задан Jiangge Zhang 11 February 2012 в 09:26
поделиться