sqlalchemy + flask: класс не определен
Я использую sqlalchemy + alembic + Flask и не могу отобразить круговые классы.
приложения / пользователи /models.py:
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
email = Column(String)
password = Column(String)
session = relationship("Session", back_populates='user', cascade='all,delete', lazy='dynamic')
notes = relationship('Note2User', back_populates='user', cascade='all,delete', lazy='dynamic')
Приложения / примечание /models.py:
class Note2User(Base):
__tablename__ = 'notes_users_m2m'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey('users.id', ondelete='CASCADE'), nullable=False)
user = relationship('User', back_populates='notes')
note_id = Column(Integer, ForeignKey('notes.id', ondelete='CASCADE'), nullable=False)
note = relationship('Note', back_populates='users')
Таблица Note2User для отношения m2m User <-> Notes, но когда я запускаю приложение и выполняю какой-то запрос, выдается ошибка:
InvalidRequestError: При инициализации mapper Mapper|User|users в выражении "Note2User" не удалось найти имя ("имя" Note2User "не определено"). Если это имя класса, подумайте о том, чтобы добавить эту связь () в класс после определения обоих зависимых классов.
Инициализация db в db /init.py: (имя dunder)
from sqlalchemy import create_engine, MetaData
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import Session
engine = create_engine('postgresql+psycopg2://server:12345@localhost:5432/test')
Base = declarative_base()
meta = MetaData()
meta.reflect(bind=engine)
db_session = Session(bind=engine)
2 ответа
Добавить импорт для Note2User
класс в apps/users/models.py
файл, так что эта модель будет определена в первую очередь, прежде чем инициализировать эту взаимосвязь в User
класс, который ссылается на него. как это
# file: apps/users/models.py
from ..notes.models import Note2User
Вам необходимо импортировать модуль user.models в модуль notes.model и наоборот. Это будет выглядеть примерно так:
# file app/users/models.py
import app.notes.models as notes
# use it like this
notes.Notes2User()
# file app/notes/models.py
import app.users.models as users
users.User()
Преимущество этого состоит в том, что вы избежите проблем круговой зависимости, поскольку ваша программа неизбежно растет. У меня было так много проблем с циклическими зависимостями, когда я создавал приложение с тем же стеком. Единственным выходом было угробить
from . import Foo
и только использовать
import bar.foo as foo
По этой причине рекомендуется использовать синтаксис импорта. Ссылка