2010-08-06 165 views
1

我在我的sqlalchemy模型中使用python類屬性和數據屬性來解決問題。這是一個小例子來說明發生了什麼事:因爲sqlalchemy模型中的python數據屬性

# -*- 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() 

該代碼的錯誤時,對象從DB __init__採取不跑那麼data_attribute不存在。如果我把data_attributeColumn對象變成一個類屬性(我認爲),因此它對User的所有實例都具有相同的值。這不是我想要的。

如果我的用戶對象上的數據屬性不是來自數據庫,而且對於User的每個實例都是唯一的,我需要做些什麼?

編輯:我應該指出,data_attribute不會總是隻是一個簡單的字符串設置在__init__ - 這只是爲了演示問題。

回答

1

您應該使用super()調用基類的構造函數:根據我的print語句`用戶.__ init__`從來沒有運行,因此如何能

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

我打電話給基地?有沒有我在這裏失蹤的一些蟒蛇魔術? – OrganicPanda 2010-08-06 09:35:18

+0

我誤解了部分問題,所以我想這不會直接適用。 – robert 2010-08-06 10:43:20