【问题标题】:Freezegun does not work on django orm create_at fieldFreezegun 不适用于 django orm create_at 字段
【发布时间】:2020-11-27 14:32:29
【问题描述】:

我正在尝试使用 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 时间?

非常感谢。

【问题讨论】:

    标签: python python-2.7 django-orm freezegun


    【解决方案1】:

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

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

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

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

    class Customer(models.Model):
            created_at = models.DateTimeField(auto_now_add=True, null=True)

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

    【讨论】:

    • 哦,哇,我在这个问题上花了这么长时间.. 非常感谢! (刚刚给你买了杯咖啡;D)谢谢威廉!
    猜你喜欢
    • 2016-09-03
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    相关资源
    最近更新 更多