为关系设置SQLAlchemy默认选项

时间:2015-03-08 13:37:40

标签: python sqlalchemy

有没有办法为关系定义(以及其他结构,如Session)提供默认选项。我正在构建一个JSON API,并希望将所有关系定义为lazy =' dynamic',因为我需要允许进一步过滤大部分。

E.g。当我将客户端模型定义为:

class Client(DeclarativeBase):
    __tablename__ = 'client'

    query        = Session.query_property()
    id           = Column(Integer, nullable = False, primary_key = True)
    transactions = relationship('Transaction', back_populates = 'client',
                                               order_by = 'Transaction.id',
                                               lazy = 'dynamic')

然后我可以使用

过滤交易
client = Client.query.first()
client.transactions.filter_by(**conditions).all()

其中condition是属性值的字典。有没有办法使懒惰='动态'默认?

2 个答案:

答案 0 :(得分:0)

编写另一个函数lazy_relationship,返回relationship并传递给它的参数,加上lazy=True参数。

这是一个简单的例子:

from sqlalchemy.orm import relationship

def lazy_relationship(*args, **kwargs):
    return relationship(*args, lazy='dynamic', **kwargs)

在生产中,您还可以检查lazy=True是否作为lazy_relationship的参数传递,并在返回relationship之前处理该情况。

这种方法可以扩展为创建一个通用效用函数,可以在项目的其他地方使用:

更新:添加了一些代码来说明这是如何推广的

def set_defaults(func, default_value_dict):
    def helper(*args, **kwargs):
        kwargs.update(default_value_dict)
        return func(*args, **kwargs)
    return helper

lazy_relationship = set_defaults(relationship, {'lazy': 'dynamic'})
# then you can call `lazy_relationship` as you'd call `relationship`.

答案 1 :(得分:0)

我想出了用relationship覆盖partial(relationship, lazy='dynamic')(使用functools模块中的部分函数)

如果关系是一对一或多对一关系,则会引发错误。

例如,定义新的关系名称可能会更好

has_many = partial(relationship, lazy='dynamic')

以及根据需要使用