#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
С помощью приведенного выше кода:
- Первый
FooFactory
установитself.parent = FooFactory(parent__parent__parent=None)
- Родительский элемент установит
self.parent = FooFactory(parent__parent=None)
- Прародитель установит
self.parent = FooFactory(parent=None)
- Установит прародитель
self.parent = None
, тем самым завершив рекурсию.
Комментарии:
1. попробовав предложенное вами решение, я столкнулся со следующей проблемой:
Received deep context for unknown fields: {'parent__parent__parent': None}
, не могли бы вы дать мне несколько идей о том, как решить эту проблему?