需要在 pytest 工厂中覆盖 django auto_now_add

Muh*_*zad 3 django unit-testing pytest django-rest-framework pytest-django

由于django 模型中的auto_now_add,sent_at在 pytest 工厂中不起作用。需要覆盖 pytest 工厂的 sent_at

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)
Run Code Online (Sandbox Code Playgroud)

Jor*_*wal 8

也许可以查看在factory_boy github上发布的这个解决方案: https://github.com/FactoryBoy/factory_boy/issues/102

简而言之,有2种解决方案:

  • 删除auto_now_add模型字段中的 并改为使用default=timezone.now. 它非常相似,只是该字段在管理中不会是只读的。但现在您可以轻松地覆盖/更新它
  • 重写该_create方法,以便它设置字段并在最初创建实例后重新保存实例

  • 第一个解决方案肯定是更好的解决方案。 (2认同)