Необходимо переопределить django auto_now_add в фабрике pytest

Из-за auto_now_add в моделях django sent_at не работает в pytest factory. Необходимо перепрошить sent_at для pytest factory

class ABC(models.Model):
    x = models.ForeignKey(X, on_delete=models.CASCADE, related_name="xx")
    y = models.ForeignKey(Y, on_delete=models.CASCADE, related_name="yy")
    sent_at = models.DateTimeField(auto_now_add=True)


class ABCFactory(factory.django.DjangoModelFactory):
    x = factory.SubFactory(XFactory)
    y = factory.SubFactory(YFactory)
    sent_at = timezone.now() - timezone.timedelta(seconds=40)

Возможно, проверьте это решение, опубликованное на github factory_boy: https://github.com/FactoryBoy/factory_boy/issues/102

Короче говоря, есть 2 решения:

  • Удалите auto_now_add в поле вашей модели и вместо него используйте default=timezone.now. Это будет довольно похоже, за исключением того, что поле не будет доступно только для чтения в админке. Но теперь вы можете легко переопределить/обновить его
  • .
  • Переопределите метод _create так, чтобы он устанавливал поле, и пересохраните экземпляр после того, как он был первоначально создан
  • .
Вернуться на верх