Как создать фабрики-бои для моделей Django с внешним ключом

Я пытаюсь протестировать метод api post с фабричным мальчиком, но получаю ошибки. Я получаю ошибку:

ValueError: Невозможно присвоить "'User 0'": "CustomUser.user" должен быть экземпляром "User".

tests.py:

class UserFactory(factory.django.DjangoModelFactory):

class Meta:
    model = CustomUser

user = factory.Sequence(lambda n: "User %d" % n)


class EventFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Event
user = factory.SubFactory(UserFactory)


john = EventFactory()

моя модель:

class Event(models.Model):
    name = models.CharField('the name of the event', max_length=255)
    created_at = models.DateTimeField(default=timezone.now, validators=[LessThanNowValidator()])
    additional_data = models.CharField(max_length=300, blank=True, default='')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE)



class CustomUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    api_token = models.CharField(max_length=100, blank=True, null=True, unique=True)

Вы можете использовать декоратор post_generation для работы со связанными моделями:

class EventFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = Event

    user = None


class UserFactory(factory.django.DjangoModelFactory):

    class Meta:
        model = CustomUser

    user = factory.Sequence(lambda n: "User %d" % n)


    @factory.post_generation
    def user_related_models(obj, create, extracted, **kwargs):
        if not create:
            return
        EventFactory.create(
            user=obj
        )
Вернуться на верх