如何设置SQLAlchemy关系以访问字段值而非相关实例
下面这个不完整的代码片段用声明式语法定义了一个基本的SQLAlchemy关系...
Base = declarative_base()
class Movie(Base):
__tablename__ = 'movies'
id = Column(Integer, primary_key=True)
name = Column(String)
director = relationship("People", uselist = False)
class People(Base):
__tablename__ = 'people'
id = Column(Integer, primary_key=True)
name = Column(String, nullable = false)
要获取导演的名字,可以这样做:
assert isinstance(movie, Movie) # <-- retrieved with query or whatever
director_name = movie.director.name
如果为了方便,我总是想让director
这个关系直接给我导演的名字,而不是一个People实例,那该怎么做呢?比如,它应该像这样工作:
assert isinstance(movie, Movie)
director_name = movie.director # <-- should get the string directly
我99%确定我之前做过这个,但现在找不到任何参考代码或文档了。我快要疯了,试图找到它。Stack Overflow将是一个很好的、永久的答案参考地点。
2 个回答
2
如果你使用属性会怎样呢?
class Movie(Base):
__tablename__ = 'movies'
id = Column(Integer, primary_key=True)
name = Column(String)
_director = relationship("People", uselist = False)
@property
def director_name(self):
return self._director.name
2
关联代理用于在Python中进行各种“对象引用->属性引用”的转换。相关文档已经进行了更新和重写:
http://www.sqlalchemy.org/docs/orm/extensions/associationproxy.html