Freezegun 不适用于 django orm create_at 字段

Freezegun does not work on django orm create_at field

我正在尝试使用 freezegun 进行单元测试:

    class Customer(models.Model):
        created_at = models.DateTimeField(default=datetime.now, null=True)


    from freezegun import freeze_time

    with freeze_time(datetime(2020, 9, 9, 9), tz_offset=9):
            customer = Customer.objects.create()
            print 'created at', customer.created_at

    # prints: created at 2020-11-27 19:54:11.994688

因此,由于某种原因,冻结时间似乎不适用于 django orm。 我无法在我要测试的函数中执行 Customer.objects.create(created_at=...)

如何使用 freezegun 正确设置 created_at 时间?

非常感谢。

问题是您直接传递了 函数 ,因此当 freezegun 覆盖 datetime.now 属性时,这对对的引用没有影响函数。

另一种方法可能是创建一个自定义函数,您每次都可以在其中检索属性:

def <b>current_time</b>():
    return datetime.now()

class Customer(models.Model):
        created_at = models.DateTimeField(<b>default=current_time</b>, null=True)

但是Django其实已经有办法使用创建时间了:你可以指定auto_now_add=True [Django-doc]:

class Customer(models.Model):
        created_at = models.DateTimeField(<b>auto_now_add=True</b>, null=True)

这还将将该字段设置为 editable=False [Django-doc],这样,默认情况下,它不会显示在 ModelForm 中。