如何在SQLAlchemy中使用mixin类的列名作为backref(.., order_by=..)?

3 投票
1 回答
515 浏览
提问于 2025-04-17 16:56

我修改了基础类,添加了三个默认的列,这些列是我所有表格都有的:

class Base(object):
    id            = Column(Integer, primary_key=True)
    date_created  = Column(DateTime, default=func.current_timestamp())
    date_modified = Column(DateTime, default=func.current_timestamp(),
                                     onupdate=func.current_timestamp())

我有两个列之间的一对多关系:

class User(Base):
    __tablename__ = 'users'

    name          = Column(Text)
    password      = Column(Text)

    items = relationship("Item", backref=
                 backref('user', order_by=date_modified),
                                 cascade="all, delete, delete-orphan")

class Item(Base):
    __tablename__ = 'items'

    user_id       = Column(Integer, ForeignKey('users.id'))
    title         = Column(Text)

之前,如果我在每个表的类里明确地定义了 date_created 和 date_modified 这两个列,这个关系是可以正常工作的。但是,当我从基础类继承时,就出现了问题,出现了以下错误:

NameError: 名称 'date_modified' 未定义

我该如何使用 order_by=column_from_mixinorder_by=date_modified)来排序这个反向关系呢?

谢谢。

1 个回答

5

你可以使用这两种方式:

backref('user', order_by=lambda: User.date_modified)
backref('user', order_by='User.date_modified')

类的属性可以通过类名来访问,比如 User.date_modified,但是在那时类本身还没有被定义。提供可调用的东西(第二种情况在内部会转换为可调用的)会把名字的解析推迟到第一次使用这些映射的时候,这时所有的映射类都已经定义好了。

撰写回答