如何在 pytest 的模型中为自引用列创建工厂列?
How to create factory column for self referential column in a model in pytest?
我有一个模型,其中有一列是自引用外键。
class Foo(db.Model):
foo_ref_id = db.Column(
db.Integer,
db.ForeignKey("foo.id", ondelete="CASCADE"),
nullable=True,
index=True,
)
我正在尝试为同一模型创建工厂模型:
class FooFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Foo
context_base_id = factory.SubFactory("tests.factories.BaseFactory", parent=None)
context_base_id = factory.LazyAttribute(lambda x: BaseFactory(parent=None))
context_base_id = factory.Trait(
parent_category=factory.SubFactory("tests.factories.BaseFactory")
)
我已经尝试了 3 种方法来实现这一目标。全部return超出最大递归深度的错误。
这样做的正确方法是什么?
你必须告诉工厂在哪里停止。
最简单的选择是向 SubFactory
调用传递一个额外参数:
class FooFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Foo
parent = factory.SubFactory(
'apps.foo.factories.FooFactory',
parent__parent__parent=None,
)
# Other fields here
使用上面的代码:
- 第一个
FooFactory
会设置self.parent = FooFactory(parent__parent__parent=None)
- parent 将设置
self.parent = FooFactory(parent__parent=None)
- 盛大parent将设置
self.parent = FooFactory(parent=None)
- great-grandparent会设置
self.parent = None
,从而结束递归。
我有一个模型,其中有一列是自引用外键。
class Foo(db.Model):
foo_ref_id = db.Column(
db.Integer,
db.ForeignKey("foo.id", ondelete="CASCADE"),
nullable=True,
index=True,
)
我正在尝试为同一模型创建工厂模型:
class FooFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Foo
context_base_id = factory.SubFactory("tests.factories.BaseFactory", parent=None)
context_base_id = factory.LazyAttribute(lambda x: BaseFactory(parent=None))
context_base_id = factory.Trait(
parent_category=factory.SubFactory("tests.factories.BaseFactory")
)
我已经尝试了 3 种方法来实现这一目标。全部return超出最大递归深度的错误。
这样做的正确方法是什么?
你必须告诉工厂在哪里停止。
最简单的选择是向 SubFactory
调用传递一个额外参数:
class FooFactory(factory.alchemy.SQLAlchemyModelFactory):
class Meta:
model = Foo
parent = factory.SubFactory(
'apps.foo.factories.FooFactory',
parent__parent__parent=None,
)
# Other fields here
使用上面的代码:
- 第一个
FooFactory
会设置self.parent = FooFactory(parent__parent__parent=None)
- parent 将设置
self.parent = FooFactory(parent__parent=None)
- 盛大parent将设置
self.parent = FooFactory(parent=None)
- great-grandparent会设置
self.parent = None
,从而结束递归。