2010-08-06 3 views
1

Je commence à avoir des problèmes avec les attributs de classe python et les attributs de données dans mon modèle sqlalchemy. Ce petit exemple pour illustrer ce qui se passe:Attributs de données python dans le modèle sqlalchemy

# -*- coding: utf-8 -*- 
import cherrypy 
import sqlalchemy 
from sqlalchemy import create_engine 
from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey 
from sqlalchemy.orm import sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

engine = create_engine('mysql://USER:[email protected]/SCHEMA?charset=utf8', echo=True) 
Session = sessionmaker(bind=engine) 
session = Session() 
Base = declarative_base() 

class User(Base): 
    __tablename__ = 'user' 

    id = Column(Integer, primary_key=True) 
    username = Column(String, nullable=False) 
    name = Column(String, nullable=False) 
    email = Column(String, nullable=False) 

    def __init__(self, username, name, email): 
     self.username = username 
     self.name = name 
     self.email = email 
     self.data_attribute = "my data attribute" 
     print "__init__" 

    def __repr__(self): 
     print "__repr__" 
     return "<User('%s','%s', '%s')>" % (self.username, self.name, self.email) 

class Root(object): 

    @cherrypy.expose 
    def test(self):   
     our_user = session.query(User).one()   
     return our_user.data_attribute #error 

if __name__ == '__main__': 

    cherrypy.tree.mount(Root()) 
    cherrypy.server.quickstart() 
    cherrypy.engine.start() 

que les erreurs de code, car lorsque les objets sont pris de la DB __init__ ne fonctionne pas si data_attribute n'existe pas. Si je mets data_attribute avec les objets Column devient un attribut de classe (je pense) et porte donc la même valeur pour toutes les instances de User. Ce n'est pas ce que je veux.

Que dois-je faire pour avoir un attribut de données sur mon objet Utilisateur qui ne provient pas de la base de données mais est également unique pour chaque instance de User?

Éditer: Je devrais probablement souligner que data_attribute ne sera pas toujours juste une simple chaîne définie dans __init__ - c'est juste pour démontrer le problème.

Répondre

1

Vous devez utiliser super() pour appeler le constructeur de la classe de base:

def __init__(self, username, name, email, *args, **kwargs): 
    super(User, self).__init__(*args, **kwargs) # Python 2.x or 3.x 
    #super().__init__(*args, **kwargs) # Python 3.x only 
    self.username = username 
    ... 
+0

selon ma déclaration d'impression 'utilisateur .__ init__' fonctionne jamais alors comment peut Je fais un appel à la base? Y a-t-il de la magie python qui me manque ici ?? – OrganicPanda

+0

J'ai mal lu une partie de la question, donc je suppose que cela ne s'applique pas directement. – robert

Questions connexes