2013-10-06 251 views
12

我有3種型號:用戶,角色,UserRole的燒瓶SQLAlchemy的 - 模型具有燒瓶SQLAlchemy的創建沒有屬性 'foreign_keys'

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,並停止了它。這只是一個側面項目。

+0

發佈源代碼的部分原因是我們可以嘗試在我們這邊重現問題。但是,如果我們不知道ActiveRecord是什麼,或者您已經設置了您試圖運行該命令的「控制檯」,我們就無法做到這一點。有沒有一種方法可以創建一個複製問題的單個腳本? –

回答

23

這裏有點難,因爲你正在使用一些未知的基類,比如「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"))