Как создать тестовый пример с помощью Factory boy? Django

Я пытаюсь протестировать свой код с помощью factory boy, но все равно получаю ошибки типа

"django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username " или

"Строка в таблице 'analytics_event' с первичным ключом '1' имеет недопустимый внешний ключ: analytics_event.created_by_id содержит значение '7', которое не имеет соответствующего значения в auth_user.id"

моя модель:

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)

    def __str__(self):
        return f"{self.name}"


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)

    def __str__(self):
        return f"{self.user.username}"

Я пытаюсь протестировать с помощью factory boy:

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

           created_by = None


class UserFactory(factory.django.DjangoModelFactory):
      class Meta:
           model = User

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

       @factory.post_generation
       def user_related_models(obj, create, extracted, **kwargs):
          if not create:
               return
          EventFactory.create(
          created_by=obj
             )


john = UserFactory.create()


    


class EventTestCase(TestCase):

    def test_post(self):
        self.assertEquals(
            Event.objects.count(),
            0
        )
        Event.objects.create(
            name='event1', created_by=john
        )
        self.assertEquals(
            Event.objects.count(),
            1
        )

Переместите john = UserFactory.create() в EventTestCase setUpTestData(cls).

# john = UserFactory.create()            # Replace this


class EventTestCase(TestCase):

    @classmethod                         # with this
    def setUpTestData(cls):              #
        cls.john = UserFactory.create()  #

    def test_post(self):
        self.assertEquals(
            Event.objects.count(),
            0
        )
        Event.objects.create(
            # name='event1', created_by=john     # Replace this
            name='event1', created_by=self.john  # with this
        )
        self.assertEquals(
            Event.objects.count(),
            1
        )

Пояснение

"django.db.utils.IntegrityError: UNIQUE constraint failed: auth_user.username"

Это происходит из-за создания пользователя с тем же именем пользователя "User 0" при каждом импорте модуля.

"Строка в таблице 'analytics_event' с первичным ключом '1' имеет недопустимый внешний ключ: analytics_event.created_by_id содержит значение '7', которое не имеет соответствующего значения в auth_user.id."

Это вызвано тем, что Django TestCase промывает базу данных в начале каждого теста.

From https://docs.djangoproject.com/en/3.2/topics/testing/tools/:

В начале каждого теста, перед запуском setUp(), Django будет промывать базу данных, возвращая ее в состояние, в котором она находилась непосредственно после вызова migrate.

Вернуться на верх