我有許多工廠物件,如下所示:
class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Operator
sqlalchemy_session = Session()
sqlalchemy_session_persistence = 'commit'
operator = 'equals'
它們都共享相同的Meta內部類并具有不同的模型,但它們也共享這些sqlalchemy_session和sqlalchemy_session_persistence線條。
我的問題是,是否有可能以更 DRY(不要重復自己)的方式撰寫此物件,而不必經常包含行sqlalchemy_session = Session()和sqlalchemy_session_persistence = 'commit'?
到目前為止,我至少有十幾個工廠,而且越來越重復。
uj5u.com熱心網友回復:
我不能 100% 確定您想要共享哪些會話,我能找到的唯一檔案討論了所有工廠之間的共享會話,但您正在為每個工廠類生成一個單獨的會話,而不是為每個實體生成一個單獨的會話。(它是一個類變數,因此它在所有實體之間共享)
假設這是一個疏忽,并且您實際上想要所有Meta欄位的單個會話,您將為 Meta 類創建一個基類:
class BaseMeta:
# now this sessions is shared between ALL factories
sqlalchemy_session = Session()
sqlalchemy_session_persistence = 'commit'
class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta(BaseMeta):
model = Operator
operator = 'equals'
或者,如果您希望每個類都有自己的會話,那么您可能需要工廠類的元類的工廠函式。
def generate_meta_options(model_):
class Meta:
model = model_
sqlalchemy_session = Session()
sqlalchemy_session_persistence = 'commit'
return Meta
class OperatorFactory(factory.alchemy.SQLAlchemyModelFactory):
Meta = generate_meta_options(Operator)
operator = 'equals'
如果目的是為每個實體設定一個單獨的會話,我不確定應該做什么,我無法確定有關如何實體化工廠物件的相關檔案。
uj5u.com熱心網友回復:
Meta您可以將其作為基類,而不是將其作為內部類,而只需讓工廠繼承它即可。正如您所說,他們有不同的模型,您可以簡單地為__init__. 以以下為例:
class Meta:
def __init__(self, Operator):
model = Operator
sqlalchemy_session = Session()
sqlalchemy_session_persistence = 'commit'
class Factory1(Meta, factory.alchemy.SQLAlchemyModelFactory):
def __init__(self):
op = 'equals'
super.__init__(op)
class Factory2(Meta, factory.alchemy.SQLAlchemyModelFactory):
def __init__(self):
op = 'lessthan'
super.__init__(op)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346220.html
