【问题标题】:flask many-to-many-relation leads to "Multiple classes found for path"烧瓶多对多关系导致“为路径找到多个类”
【发布时间】:2017-09-11 19:44:35
【问题描述】:

我想在烧瓶中定义一个多对多关系。 (这两个模型是UserRole。后来我想将它们用于Flask-Security。)所以我关注http://flask-sqlalchemy.pocoo.org/2.1/models/#many-to-many-relationships 并写道

class User(db.Model, UserMixin):
    __tablename__ = 'user'
    __table_args__ = { 'useexisting': True }
    id = Column(Integer, primary_key=True)
    roles = relationship("RolesUsers", backref=db.backref("user", lazy='dynamic'))

class Role(db.Model):
    __tablename__ = 'role'
    __table_args__ = { 'useexisting': True }
    id = Column(Integer, primary_key=True)
    name = Column(String(80), unique=True)


class RolesUsers(db.Model):
    __tablename__ = 'roles_users'
    __table_args__ = { 'useexisting': True }
    user_id = Column(Integer, ForeignKey('user.id'), primary_key=True)
    role_id= Column(Integer, ForeignKey('role.id'), primary_key=True)

但我得到了错误

在此注册表中找到路径“RolesUsers”的多个类 声明性基础。请使用完全模块限定的路径。

我发现那行

roles = relationship("RolesUsers", backref=db.backref("ma_user", lazy='dynamic'))

似乎对此负责。

你可能会问我为什么使用

__table_args__ = { 'useexisting': True }

那是因为否则我得到错误

已经为此 MetaData 实例定义了表“用户”。指定 'extend_existing=True' 重新定义现有的选项和列 表格对象。

也许这两个错误是挂在一起的?在我看来,该类似乎以某种方式被多次调用。但我不知道那是怎么来的。那么我该如何修复呢?

【问题讨论】:

  • 您似乎有多个类似的类定义。您是正确的,必须扩展存在是您的情况的一种症状。

标签: python sqlalchemy


【解决方案1】:

我认为对关联表使用模型类有问题。最后

roles_users = db.Table(
    'ma_roles_users',
    db.Column('user_id', db.Integer(), db.ForeignKey('ma_user.id')),
    db.Column('role_id', db.Integer(), db.ForeignKey('ma_role.id'))
)

class User(db.Model, UserMixin):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    roles = db.relationship(
        'Role',
        secondary=roles_users,
        backref=db.backref('user', lazy='dynamic')

class Role(db.Model, RoleMixin):
    __tablename__ = "role"
    id = db.Column(db.Integer(), primary_key=True)
    name = db.Column(db.String(80), unique=True)

工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2021-10-08
    • 2016-06-18
    • 2020-07-11
    • 2019-12-15
    • 2016-09-06
    • 2015-05-29
    相关资源
    最近更新 更多