Как создать фабричный столбец для самостоятельного ссылочного столбца в модели в pytest?

#pytest #factory-boy

#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 способа добиться этого. Все они возвращают ошибку превышения максимальной глубины рекурсии.

Как правильно это сделать?

Комментарии:

1. Как вы думаете, вы могли бы отправить больше кода, чтобы я мог легче запустить нерабочий пример на моей машине?

2. можете ли вы указать точные разделы кода, которыми вы хотели бы, чтобы я поделился? Я могу соответствующим образом отредактировать вопрос.

Ответ №1:

Вы должны указать фабрике, где остановиться.

Самый простой вариант — передать дополнительный параметр в 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. Родительский элемент установит self.parent = FooFactory(parent__parent=None)
  3. Прародитель установит self.parent = FooFactory(parent=None)
  4. Установит прародитель self.parent = None , тем самым завершив рекурсию.

Комментарии:

1. попробовав предложенное вами решение, я столкнулся со следующей проблемой: Received deep context for unknown fields: {'parent__parent__parent': None} , не могли бы вы дать мне несколько идей о том, как решить эту проблему?