Полиморфная идентичность на разных файлах - PullRequest
0 голосов
/ 26 марта 2019

Я пишу проект Python с SQLAlchemy, и у меня есть 2 класса - базовый класс и дочерний класс.Дочерний класс наследуется от базового класса и используется в качестве полиморфного идентификатора для поля типа базового класса.

Файл 1:

class Animal(Base):
    __tablename__ = "animals"
    animal_id = Column(String, primary_key=True)
    animal_type = Column(String)
    family = Column(String)

    @staticmethod
    def init(animal_id):
        return Sessions.main.query(Animal).filter_by(animal_id=animal_id).first()

    __mapper_args__ = {
        "polymorphic_on": animal_type,
        "polymorphic_identity": "animals"
}

Файл 2:

from animal.animal import Animal

class Lion(Animal):
    __mapper_args__ = {
        "polymorphic_identity" = "lion"
    }

Два класса помещены в разные файлы, но когда я запускаю экземпляр животного (который фактически должен быть инициирован как экземпляр льва), он вызывает исключение с No such polymorphic identity, хотя оно существует, но в другом файле.

    lion = Animal.init('lionid1')
AssertionError: No such polymorphic identity 'lion' is defined

Когда я перемещаю класс Lion в тот же файл, где находится класс Animal, инициализация проходит успешно, но это не то решение, которое мне нужно, потому что оба этих класса в конечном итоге будут слишком большимидля одного файла.

Я также не могу импортировать класс Lion в файл базового класса, поскольку дочерний класс наследует от базового класса, а затем оба они импортируют друг друга, что также вызывает ошибку:

    from lion.lion import Lion  # added on the top of file 1 
ImportError: cannot import name 'Lion'

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

1 Ответ

0 голосов
/ 26 марта 2019

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

Вы можете импортировать его на уровне пакета или в нижней части модуля animal.animal (таким образом, после создает базовый класс Animals). Импортируя его, SQLAlchemy осознает, что он существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...