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

По этой причине рекомендуется использовать синтаксис импорта. Ссылка

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