有没有办法为关系定义(以及其他结构,如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'默认?
写另一个函数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`.
我提出用relationship
重写partial(relationship, lazy='dynamic')
(使用functools模块的部分功能)
如果关系是一对一或多对一,则会引发错误。
例如,定义新的关系名称可能会更好
has_many = partial(relationship, lazy='dynamic')
并根据需要使用