需要覆盖 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
方法,以便它设置字段并在实例最初创建后重新保存它
由于 auto_now_add 在 django 模型中 sent_at 在 pytest 工厂中不工作。需要为 pytest 工厂
覆盖 sent_atclass 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
方法,以便它设置字段并在实例最初创建后重新保存它