有没有办法为关系定义(以及其他结构,如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是属性值的字典。有没有办法使懒惰='动态'默认?
答案 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')
以及根据需要使用