簡體   English   中英

從SQLAlchemy中的關系獲取對象的屬性

[英]Get attribute of object from relationship in 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='test@example.com',name='Cool Guy',base_score=100,time_zone='America/Chicago')

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

首先,我想知道這樣定義c1是否正確(使用Teacher參數)。

其次,我知道我是否可以通過以下方式獲得一名學生的老師的幫助:

s1.Class.Teacher

但是,是否有直接在Student類上創建Teacher屬性的方法(正常嗎)? 我嘗試添加:

Teacher = Class.Teacher

在類定義中,但這引發了:

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

顯然,這沒什么大不了的,但是我想知道正確的方法(如果有一種方法,或者沒有一種方法),因為我想更好地學習sqlalchemy。

所以我找到了第二個問題的答案...

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

這對於python類是通用的(我認為只是新樣式。)

現在

s1.Class.Teacher

返回Teacher對象。

編輯:由於沒有其他人回答過我的問題,並且我的所有代碼都按我認為的方式工作,因此我要說我以正確的方式對其進行了編碼(參考問題1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM