如何设置SQLAlchemy关系以访问字段值而非相关实例

2 投票
2 回答
1113 浏览
提问于 2025-04-17 00:07

下面这个不完整的代码片段用声明式语法定义了一个基本的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

撰写回答