如何在 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

使用上面的代码:

  1. 第一个FooFactory会设置self.parent = FooFactory(parent__parent__parent=None)
  2. parent 将设置 self.parent = FooFactory(parent__parent=None)
  3. 盛大parent将设置self.parent = FooFactory(parent=None)
  4. great-grandparent会设置self.parent = None,从而结束递归。