需要覆盖 pytest 工厂中的 django auto_now_add

Need to override django auto_now_add in pytest factory

由于 auto_now_add 在 django 模型中 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)

也许可以查看 factory_boy github 中发布的此解决方案: https://github.com/FactoryBoy/factory_boy/issues/102

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

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