为关系设置SQLAlchemy默认选项

问题描述 投票:1回答:2

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

例如。当我将客户端模型定义为:

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()

条件是属性值的字典。有没有办法让lazy ='dynamic'默认?

python sqlalchemy
2个回答
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`.

0
投票

我提出用relationship重写partial(relationship, lazy='dynamic')(使用functools模块的部分功能)

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

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

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

并根据需要使用

© www.soinside.com 2019 - 2024. All rights reserved.