2011-06-22 3 views
1

J'utilise le framework Flask avec sqlalchemy et je ne peux pas interroger une table liée d'un résultat.SQLAlchemy: l'objet 'Model' n'est pas appelable

> Les utilisateurs ont beaucoup> commandes

J'ai l'ordre et je veux interroger l'utilisateur qui appartient à l'ordre. Lorsque j'appelle cela, j'obtiens que l'objet 'User' n'est pas appelable. Voici comment ma relation est définie:

# ---------------------------------------------------------------------------------- 
# MODELS 
# ---------------------------------------------------------------------------------- 
class User(object): 
    __tablename__ = 'user' 

    query = db_session.query_property() 

class Order(object): 
    __tablename__ = 'order' 

    query = db_session.query_property() 

# ---------------------------------------------------------------------------------- 
# MODELS SCHEMA 
# ---------------------------------------------------------------------------------- 
users_table = Table('user', metadata, 
    Column('id', Integer, primary_key = True), 
    Column('username', String(50), unique = True), 
    Column('email', String(50), unique = True), 
    Column('password', String(32), nullable = False), 
    ... 
    mysql_engine = 'InnoDB', 
    mysql_charset = 'utf8' 
) 

orders_table = Table('order', metadata, 
    Column('id', Integer, primary_key = True), 
    Column('user_id', Integer, ForeignKey('user.id')), 
    Column('transaction_id', String(32), unique = True), 
    ... 
    mysql_engine = 'InnoDB', 
    mysql_charset = 'utf8' 
) 

# ---------------------------------------------------------------------------------- 
# MAPPERS 
# ---------------------------------------------------------------------------------- 
mapper(User, users_table, properties = { 
    # has many 
    'orders' : relationship(Order) 
}) 

mapper(Order, orders_table, properties = { 
    # belongs to 
    'user': relationship(User) 
}) 

Une idée pourquoi cette erreur?

Répondre

3

order est l'objet de commande, et vous avez défini la relation "utilisateur" comme une propriété. Par conséquent, la propriété "user" représentera l'objet utilisateur. Cela peut être différent des autres ORM que vous avez utilisés où order.user est en fait une fonction qui doit être appelée pour récupérer l'utilisateur, ou peut-être un objet de requête qui renvoie l'utilisateur.

Effectuez les opérations suivantes si vous souhaitez voir en action ...

user = order.user 
print type(user) 

Vous remarquerez que order.user retourne un « utilisateur » instance (ou dans certains cas, peut revenir None ou soulever une exception). Dans ce cas, l'appel order.user() va essayer "d'appeler" l'instance User.

Le message d'erreur est donc logique, car vous essayez d'appeler une instance User et User n'a pas été défini en tant qu'objet callable.

+0

Donc, vous voulez probablement "user.username", pas "user()" – wisty

+1

Droit, donc obtenir le nom d'utilisateur est "order.user.username", pas "order.user(). Username" –