Поле 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
Вернуться на верх