【问题标题】:How to use a column name from mixin class inside backref(.., order_by=..) with SQLAlchemy?如何通过 SQLAlchemy 在 backref(.., order_by=..) 中使用 mixin 类中的列名?
【发布时间】:2013-02-09 19:26:58
【问题描述】:

我修改了 Base 类以包含我所有表都具有的三个默认列:

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 列,这过去可以正常工作。但是,从 Base 继承时,它不起作用,并且出现以下错误:

NameError:名称“date_modified”未定义

如何使用order_by=column_from_mixin (order_by=date_modified) 对反向引用关系进行排序?

谢谢。

【问题讨论】:

    标签: python sqlite python-2.7 sqlalchemy


    【解决方案1】:

    您可以使用以下任何一种:

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

    可以使用类名User.date_modified 访问类属性,但此时类本身仍未定义。提供 callable(第二种情况在内部转换为 callable)会推迟名称解析,直到第一次使用映射,此时所有映射的类都被定义。

    【讨论】:

    • 嗨@AudriusKazukauskas。谢谢你的回答。你能详细解释一下吗?这里的逻辑是什么?这是如何工作的?
    • 你好@audriusKazukauskas。非常感谢您的解释。非常感谢您的帮助!
    猜你喜欢
    • 2012-10-09
    • 2020-11-04
    • 2017-11-16
    • 1970-01-01
    • 2020-06-09
    • 2018-12-22
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多