Bruno Fernandes
Bruno Fernandes

Reputation: 457

DateTimeField received a naive datetime with no explanantion

I am going crazy with this warning.

I am working on Django and there's this little problem which is causing me trouble. This view worked before but suddenlt it stopped working and a naive datetime warning showed up. In the command line it iterates over and over like the next image shows and the content isn't shown: Command Line Output for Warning

The views is as follows:

@login_required(login_url='/accounts/login/')
def loggedin(request):
    data = []
    data2 = []
    data3 = []
    dicdata2 = {}
    dicdata3 = {}
    datainterior = []
    today = timezone.localtime(timezone.now()+timedelta(hours=1)).date()
    tomorrow = today + timedelta(1)
    semana= today - timedelta(7)
    today = today - timedelta(1)
    semana_start = datetime.combine(today, time())
    today_start = datetime.combine(today, time())
    today_end = datetime.combine(tomorrow, time())
    for modulo in Repository.objects.values("des_especialidade").distinct():
        dic = {}
        mod = str(modulo['des_especialidade'])
        dic["label"] = str(mod)
        dic["value"] = Repository.objects.filter(des_especialidade__iexact=mod).count()
        data.append(dic)
    for modulo in Repository.objects.values("modulo").distinct():
        dic = {}
        mod = str(modulo['modulo'])
        dic["label"] = str(mod)
        dic["value"] = Repository.objects.filter(modulo__iexact=mod, dt_diag__gte=semana_start).count()
        datainterior.append(dic)
        # print mod, Repository.objects.filter(modulo__iexact=mod).count()
        # data[mod] = Repository.objects.filter(modulo__iexact=mod).count()
    dicdata2['values'] = datainterior
    dicdata2['key'] = "Cumulative Return"
    dicdata3['values'] = data
    dicdata3['color'] = "#d67777"
    dicdata3['key'] = "Diagnosticos Identificados"
    data3.append(dicdata3)
    data2.append(dicdata2)


#-------sunburst
databurst = []
dictburst = {}
dictburst['name'] = "CHP"
childrenmodulo = []
for modulo in Repository.objects.values("modulo").distinct():
    childrenmodulodic = {}
    mod = str(modulo['modulo'])
    childrenmodulodic['name'] = mod
    childrenesp = []
    for especialidade in Repository.objects.filter(modulo__iexact=mod).values("des_especialidade").distinct():
        childrenespdic = {}
        esp = str(especialidade['des_especialidade'])
        childrenespdic['name'] = esp
        childrencode = []
        for code in Repository.objects.filter(modulo__iexact=mod,des_especialidade__iexact=esp).values("cod_diagnosis").distinct():
            childrencodedic = {}
            codee= str(code['cod_diagnosis'])
            childrencodedic['name'] = 'ICD9 - '+codee
            childrencodedic['size'] = Repository.objects.filter(modulo__iexact=mod,des_especialidade__iexact=esp,cod_diagnosis__iexact=codee).count()
            childrencode.append(childrencodedic)
        childrenespdic['children'] = childrencode



        #childrenespdic['size'] = Repository.objects.filter(des_especialidade__iexact=esp).count()
        childrenesp.append(childrenespdic)
    childrenmodulodic['children'] = childrenesp
    childrenmodulo.append(childrenmodulodic)
dictburst['children'] = childrenmodulo
databurst.append(dictburst)
# print databurst



# --------stacked area chart
datastack = []
for modulo in Repository.objects.values("modulo").distinct():
    datastackdic = {}
    mod = str(modulo['modulo'])
    datastackdic['key'] = mod
    monthsarray = []
    year = timezone.localtime(timezone.now()+timedelta(hours=1)).year
    month = timezone.localtime(timezone.now()+timedelta(hours=1)).month
    last = timezone.localtime(timezone.now()+timedelta(hours=1)) - relativedelta(years=1)
    lastyear = int(last.year)
    lastmonth = int(last.month)
    #i = 1
    while lastmonth <= int(month) or lastyear<int(year):
        date = str(lastmonth) + '/' + str(lastyear)
        if (lastmonth < 12):
            datef = str(lastmonth + 1) + '/' + str(lastyear)
        else:
            lastmonth = 01
            lastyear = int(lastyear)+1
            datef = str(lastmonth)+'/'+ str(lastyear)
            lastmonth = 0
        datainicial = datetime.strptime(date, '%m/%Y')
        datafinal = datetime.strptime(datef, '%m/%Y')
        #print "lastmonth",lastmonth,"lastyear", lastyear
        #print "datainicial:",datainicial,"datafinal: ",datafinal
        filtro = Repository.objects.filter(modulo__iexact=mod)
        count = filtro.filter(dt_diag__gte=datainicial, dt_diag__lt=datafinal).count()
        conv = datetime.strptime(date, '%m/%Y')
        ms = datetime_to_ms_str(conv)
        monthsarray.append([ms, count])
        #i += 1
        lastmonth += 1
    datastackdic['values'] = monthsarray
    datastack.append(datastackdic)
    #print datastack


if request.user.last_login is not None:
    #print(request.user.last_login)
    contador_novas = Repository.objects.filter(dt_diag__lte=today_end, dt_diag__gte=today_start).count()
return render_to_response('loggedin.html',
                          {'user': request.user.username, 'contador': contador_novas, 'data': data, 'data2': data2,
                           'data3': data3,
                           'databurst': databurst, 'datastack':datastack})

Upvotes: 1

Views: 121

Answers (1)

Shang Wang
Shang Wang

Reputation: 25539

I think your statements like:

datainicial = datetime.strptime(date, '%m/%Y')

are creating native python time without timezone support. When you apply queries or assignment on those variables to the django date fields, it's going to give you the warnings. You have to make them all timezone aware in order to suppress the warnings.

An easy fix would be:

from django.utils import timezone

datainicial = datetime.strptime(date, '%m/%Y')
datainicial = timezone.make_aware(datainicial, timezone.utc)

Upvotes: 1

Related Questions