2013-10-06 11 views
12

mam 3 modele stworzone z kolbą-sqlalchemy: User, rola, UserRoleKolba-SQLAlchemy - model nie ma atrybutu '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) 

Jeśli próbuję (w konsoli), aby dostać się do wszystkich użytkowników poprzez User.query.all() uzyskać AttributeError: 'NoneType' object has no attribute 'all' i jeśli próbuję znowu mam kolejny błąd mówiąc:

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' 

Czy ktoś może rzucić światło na to, co to jest dokładnie to, że jestem robić źle? Wydaje mi się, że ten kod działa już kilka miesięcy temu, ale ostatnio zaktualizowałem SQLAlchemy, Flask i Flask-SQLAlchemy i przestałem. To tylko poboczny projekt.

+0

Jednym z powodów dodania kodu źródłowego jest to, że możemy próbować odtworzyć problem po naszej stronie. Jednak bez wiedzy o tym, czym jest ActiveRecord lub o tym, jak skonfigurowałeś "konsolę", w której próbujesz uruchomić polecenie, nie możemy tego zrobić. Czy istnieje sposób, aby utworzyć pojedynczy skrypt, który powiela problem? –

Odpowiedz

23

Jest to trochę trudne, ponieważ używasz nieznanych klas podstawowych, takich jak "ActiveRecord" i inne. Jednakże, wygląda bardzo podobnie, że „wtórny” argument jest źle:

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 potrzeby odnosić się do Table obiektu, a nie mapowane klasy, jeśli wg nazwy strun to byłoby "user_roles":

roles = db.relationship("Role", secondary = "user_roles", \ 
     backref = db.backref("users")) 
Powiązane problemy