RuntimeWarning:DateTimeField 在时区支持处于活动状态时接收到原始日期时间

RuntimeWarning: DateTimeField received a naive datetime while time zone support is active

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

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

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

activity_time 在模型中是 DateTimeField(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

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

我可以看到您的代码有一些改进。使用 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 请求等等。只是一个想法。