Flask-SQLAlchemy-model не имеет атрибута "внешние ключи"


У меня есть 3 модели, созданные с помощью Flask-SQLalchemy: User, Role, UserRole

User.py:

class Role( ActiveRecord, db.Model ):

    __tablename__ = "roles"

    #   Schema
    id = db.Column( db.Integer, primary_key = True )
    name = db.Column( db.String( 24 ), unique = True )
    description = db.Column( db.String( 90 ) )

    users = db.relationship( "User", secondary = "UserRole", 
        backref = db.backref( "roles" ) )

Role.py:

class User( db.Model, ActiveRecord ):

    __tablename__ = "users"

    #   Schema
    id = db.Column( db.Integer, primary_key = True )
    email = db.Column( db.String( 90 ), unique = True )
    password = db.Column( db.String( 64 ) )

    #   Relations
    roles = db.relationship( "Role", secondary = "UserRole", 
        backref = db.backref( "users" ) )

User_role.py:

class UserRole( ActiveRecord, db.Model ):

    __tablename__ = "user_roles"

    #   Schema
    user_id = db.Column( db.Integer, db.ForeignKey( 'users.id' ), primary_key = True )
    role_id = db.Column( db.Integer, db.ForeignKey( 'roles.id' ), primary_key = True )

Если я попытаюсь (в консоли) получить всех пользователей через User.query.all(), я получу AttributeError: 'NoneType' object has no attribute 'all', и если я попытаюсь снова, я получу еще одну ошибку, говоря:

sqlalchemy.exc.InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers.  Original exception was: type object 'UserRole' has no attribute 'foreign_keys'
Может ли кто - нибудь пролить свет на то, что именно я делаю неправильно? Я думаю, что у меня был этот код работает нормально несколько месяцев назад, но я обновил SQLAlchemy, Flask и Flask-SQLAlchemy недавно и это остановился. Это просто побочный проект.
1 15

1 ответ:

Здесь немного сложно, потому что вы используете некоторые неизвестные базовые классы, такие как "ActiveRecord" и тому подобное. Однако, похоже, что "вторичный" аргумент неверен:

class User( db.Model, ActiveRecord ):

    __tablename__ = "users"

    #   Schema
    id = db.Column( db.Integer, primary_key = True )
    email = db.Column( db.String( 90 ), unique = True )
    password = db.Column( db.String( 64 ) )

    #   Relations
    roles = db.relationship( "Role", secondary = "UserRole", \
        backref = db.backref( "users" ) )

secondary необходимо ссылаться на объект Table, а не на отображаемый класс, если по имени строки, то это будет "user_roles":

    roles = db.relationship( "Role", secondary = "user_roles", \
        backref = db.backref( "users" ) )