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
中。
我正在尝试使用 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
中。