【问题标题】:RuntimeWarning: DateTimeField received a naive datetime while time zone support is activeRuntimeWarning:在时区支持处于活动状态时,DateTimeField 收到了一个幼稚的日期时间
【发布时间】:2020-10-13 07:35:22
【问题描述】:

在这里我正在编写一个中间件来删除超过 3 个月的对象。 date_before_2_monthdatetime_before_2_months 工作正常。我还没有测试过滤但是在我的控制台中它给了我一个运行时警告说activity_time收到了一个天真的日期时间。

这个警告是一个问题(需要解决)还是我们可以忽略它

我的过滤器参数也适用于从模型中查询 2 个月大的对象吗?

模型中的activity_timeDateTimeField(auto_now_add=True)

class UserActivityLogDeleteMiddleware(object):  # middleware for deleting user activity logs which are older than 2 months

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        date_before_2_month = datetime.date.today() - relativedelta(months=2) 
        # converting into datetime
        datetime_before_2_month = datetime.datetime.combine(date_before_2_month, datetime.time(9, 00, 00))
        # deleting logs older than 2 months
        UserActivityLog.objects.filter(activity_time__lt=datetime_before_2_month).delete()

        response = self.get_response(request)
        return response

【问题讨论】:

标签: django django-views python-datetime


【解决方案1】:

通常,如果您通过应用使用时区,则您希望了解日期时间时区。

我可以看到您的代码有一些改进。使用 relativedelta 时,您可以设置小时和分钟,让生活更轻松。

from django.utils import timezone

...

def __call__(self, request):
    # Getting a datetime for 2 months ago at 9am
    dt_2_months_ago = timezone.now() - relativedelta(months=2, hour=9, minute=0) 

    # deleting logs older than 2 months
    UserActivityLog.objects.filter(activity_time__lt=dt_2_months_ago).delete()

    response = self.get_response(request)
    return response

请注意,您确定要在中间件中运行它吗?它会在每一个请求上运行,每次你得到 js 时,每一个 ajax 请求等等。只是一个想法。

【讨论】:

  • 我不希望用户去某个特定的视图来删除活动日志,所以我把它写在中间件中。除了中间件还有什么办法吗?
  • 有几种方法可以做到这一点。最好的方法是让 CronJob 定期运行,例如每三个小时运行一次。或者覆盖你的 UserActivityLog 模型的保存方法。
猜你喜欢
  • 2012-07-18
  • 2020-06-19
  • 2016-10-03
  • 2019-07-23
  • 2020-09-19
  • 1970-01-01
  • 2018-05-14
  • 2014-12-03
  • 1970-01-01
相关资源
最近更新 更多