2017-09-05 75 views
2

我想在烧瓶中定义多对多关系。 (这两个模型是UserRole。Lateron我想将它们用于瓶的安全性。)所以我也跟着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 } 

那是因为别的我得到

表“用户”已是该元数据实例定义的错误。指定 'extend_existing = True'可重新定义现有的 表对象上的选项和列。

也许这两个错误挂在一起?在我看来,这个类看起来好像多次被称为类。但我不知道可能会如何。那么我该如何修复?

+0

这会显得你已经多次类似的类定义。你是正确的,不得不延长现有是你的情况的一个症状。 –

回答

0

我觉得有什么不对的模型类,为关联表的使用。最后

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) 

工作。