2013-10-06 32 views
12

Ich habe 3 Modelle erstellt mit Flask-sqlalchemy: Benutzer, Rollen, UserroleFlask-SQLAlchemy - Modell hat kein Attribut '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) 

Wenn ich (in der Konsole) versuchen alle Benutzer erhalten über User.query.all() ich AttributeError: 'NoneType' object has no attribute 'all' bekommen und wenn ich versuche, wieder erhalte ich einen anderen Fehler zu sagen:

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' 

Kann jemand ein Licht auf, was es genau ist, dass ich bin falsch machen? Ich denke, ich hatte diesen Code vor ein paar Monaten in Ordnung, aber ich aktualisierte SQLAlchemy, Flask und Flask-SQLAlchemy vor kurzem und es hörte auf. Es ist nur ein Nebenprojekt.

+0

Ein Teil des Grundes, Quellcode zu veröffentlichen, ist so, dass wir versuchen können, das Problem auf unserer Seite zu reproduzieren. Ohne dass wir jedoch wissen, was ActiveRecord ist oder wie Sie die "Konsole" eingerichtet haben, in der Sie versuchen, den Befehl auszuführen, können wir das nicht tun. Gibt es eine Möglichkeit, ein einzelnes Skript zu erstellen, das das Problem dupliziert? –

Antwort

23

es ist ein bisschen schwierig hier, weil Sie einige unbekannte Basisklassen wie "ActiveRecord" und so verwenden. Es ist jedoch ziemlich genau wie das „sekundäre“ Argument aussieht, ist falsch:

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 Bedürfnisse zu einem Table Objekt zu verweisen, nicht abgebildet Klasse, wenn sie von string name dann wäre es "user_roles" sein:

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