Search code examples
pythondjangoutc

Delete django data without RuntimeWarning: DateTimeField received a naive datetime


I am trying to delete 3 years old data in my python django db. Here is code:

from datetime import datetime
from dateutil.relativedelta import relativedelta

def db_cleanup():
    cleanup_start = datetime.utcnow().date()
    three_years_ago = cleanup_start - relativedelta(years=3)

    MyData.objects.filter(create_date__lt=three_years_ago).delete()

however I receive RuntimeWarning: DateTimeField received a naive datetime . How to do it properly?


Solution

  • Use timezone.now() to create an aware datetime then reset time to midnight but keep a datetime object (not date):

    from django.utils import timezone
    from dateutil.relativedelta import relativedelta
    
    def db_cleanup():
        cleanup_start = timezone.now().replace(hour=0, minute=0, second=0, microsecond=0)
        three_years_ago = cleanup_start - relativedelta(years=3)
    
        MyData.objects.filter(create_date__lt=three_years_ago).delete()