Как создать фабрики-бои для моделей 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
)