Поле Factory boy для самореферентного поля в абстрактной модели django
`класс BaseOrganization( OrganizationModelMixin, TimeStampedModel, OrganizationWidgetsMixin ): name = models.CharField(max_length=255, verbose_name="Nomlanishi", null=True) юридический_адрес = models.CharField( max_length=150, verbose_name="Yuridik manzili", null=True, blank=True ) phone_number = models.CharField( max_length=150, verbose_name="Telefon raqami", null=True, blank=True, validators=[phone_regex], ) parent = models.ForeignKey( "self", on_delete=models.SET_NULL, null=True, blank=True, related_name="%(class)s_children", verbose_name="Yuqori tashkilot", )
class Meta:
abstract = True
class BaseOrganizationFactory(factory.django.DjangoModelFactory):
"""Base organization factory"""
name = factory.Faker("company")
juridical_address = factory.Faker("address")
phone_number = factory.Faker("phone_number")
parent = factory.SubFactory(
"myapp.tests.factories.BaseOrganizationFactory",
)
@pytest.mark.django_db class TestBaseOrganization: @pytest.fixture(autouse=True) def setup(self): self.base_organization = BaseOrganizationFactory( parent=None ) `
если я вызываю BaseOrganizationFactory в методе setup, это вызывает ошибку RecursionError: maximum recursion depth exceeded while calling a Python object
Это происходит потому, что BaseOrganizationFactory создает круговую ссылку с родительским полем, указывающим на самого себя. Это создает бесконечную рекурсию в процессе создания фабрики.
Измените свою фабрику, чтобы избежать создания круговых ссылок. Один из способов сделать это - установить родительское поле в None или случайное значение. Измените логику в соответствии с потребностями бизнес-логики
class BaseOrganizationFactory(factory.django.DjangoModelFactory):
"""Base organization factory"""
name = factory.Faker("company")
juridical_address = factory.Faker("address")
phone_number = factory.Faker("phone_number")
# Using factory.LazyAttribute to avoid circular reference
parent = factory.SubFactory("myapp.tests.factories.BaseOrganizationFactory")
class Meta:
model = BaseOrganization
@pytest.mark.django_db
class TestBaseOrganization:
@pytest.fixture
def base_organization(self):
return BaseOrganizationFactory(parent=None)
def test_something(self, base_organization):
# Your test code here
assert base_organization is not None