2013-05-06 79 views
0

考慮下面的代碼定義了一些類:使用類獲取對象的屬性在SQLAlchemy的

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import Column, Integer, Float, String, DateTime 
from sqlalchemy import ForeignKey, UniqueConstraint 
from sqlalchemy.orm import relationship, backref 

class Base(object): 
    id = Column(Integer, primary_key=True) 
Base = declarative_base(cls=Base) 

class Teacher(Base): 
    __tablename__ = 'teacher' 

    email = Column(String, unique=True) 
    name = Column(String, nullable=False) 
    password = Column(String) 
    base_score = Column(Float) 
    time_zone = Column(String) 

    def __repr__(self): 
     return '<Teacher({0})>'.format(self.email) 

class Class(Base): 
    __tablename__ = 'class' 

    teacher_id = Column(Integer, ForeignKey('teacher.id', ondelete="CASCADE"), nullable=False, index=True) 
    Teacher = relationship("Teacher", backref=backref('classes', order_by='Class.id')) 
    name = Column(String, index=True) 

    __table_args__ = (UniqueConstraint('teacher_id','name'),) 

    def __repr__(self): 
     return '<Class({0})>'.format(self.name) 

class Student(Base): 
    __tablename__ = 'student' 

    class_id = Column(Integer, ForeignKey('class.id', ondelete="CASCADE"), nullable=False, index=True) 
    Class = relationship("Class", backref=backref('students', order_by='Student.id')) 
    name = Column(String, index=True) 

    __table_args__ = (UniqueConstraint('class_id','name'),) 

    def __repr__(self): 
     return '<Student({0})>'.format(self.name) 

以下代碼:

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

engine = create_engine('sqlite:///:memory:', echo=True) 

Base.metadata.create_all(engine) 
Session = sessionmaker(bind=engine) 
session = Session() 

t = Teacher(email='[email protected]',name='Cool Guy',base_score=100,time_zone='America/Chicago') 

c1 = Class(Teacher=t,name='Mathematics') 
s1 = Student(Class=c1,name='Bob Roberts') 

首先,我想知道定義c1就像這是正確的方式(使用老師的參數)

其次,我知道我是否可以通過這樣做讓學生的老師:

s1.Class.Teacher 

但無論如何(這是正常的),直接在學生類創建一個教師屬性?我嘗試添加:

Teacher = Class.Teacher 

在類的定義,但拋出:

AttributeError: 'RelationshipProperty' object has no attribute 'Teacher' 

很顯然,這不是什麼大不了的事,但我想知道正確的方式(如果有的話,或者說沒有一個),因爲我試圖更好地學習sqlalchemy。

回答

0

於是我發現了答案,我的第二個問題......只是做

@property 
def Teacher(self): 
    return self.Class.Teacher 

這是通用的Python類(新風格的只有我想的。)

現在

s1.Class.Teacher 

返回教師對象。

編輯:由於沒有其他人回答我的問題,我所有的代碼的工作原理都是我認爲應該的,所以我會說我用正確的方式編碼了它(參考問題1.)