es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Advertencia de tiempo de ejecución: El campo DateTimeField Model.date recibió una fecha y hora ingenuas mientras el soporte de zona horaria está activo.

Estoy intentando filtrar un conjunto de consultas para obtener todas las publicaciones de este año.

Django se queja de que la declaración de start_day y end_day puede estar en conflicto con django.utils.timezone, pero creo que no es un gran problema.


Pero la advertencia es molesta, cualquier sugerencia para deshacerse de ella (sin deshabilitar la advertencia de Django) será apreciada, algo como cómo obtener el primer día del año y el último de django.utils.

Aquí está el módulo implementado en mi proyecto que tiene métodos que pueden ayudarte.

“`py
import pytz
import datetime
from django.utils import timezone
from django.conf import settings
from django.db.models import Q
from django.utils.dateparse import parse_datetime

def when(create):
return “%s/%s/%s” % (create.month, create.day, create.year)

def current():
return when(timezone.now())

def howLongAgo(
create,
now,
li=[
‘秒’,
‘分’,
‘时’,
‘天’,
‘周’,
‘月’,
‘年’,
],
lst=’之前’,
long=2
):
dif = create – now
sec = dif.days * 24 * 60 * 60 + dif.seconds
minute = sec // 60
sec %= 60
hour = minute // 60
minute %= 60
day = hour // 24
hour %= 24
week = day // 7
day %= 7
month = (week * 7) // 30
week %= 30
year = month // 12
month %= 12
s = []
for ii, tt in enumerate([sec, minute, hour, day, week, month, year]):
ss = li[ii]
if tt != 0:
s.append(str(tt) + ss)
return ‘ ‘.join(list(reversed(s))[:long]) + lst

def dateToDatetime(li):
res = []
for ar in li:
res.append(datetime.datetime.combine(ar, datetime.datetime.min.time()))
return res

def datespan(startDate, endDate, delta=datetime.timedelta(days=1)):
currentDate = startDate
while currentDate < endDate:
yield currentDate
currentDate += delta

def thisMonthQuerySet(objects):
today = timezone.now()
year = today.year
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(year, today.month, 1)))
end_day = start_day + datetime.timedelta(30)
return objects.filter(date__range=[start_day, end_day])

def lastMonthQuerySet(objects):
today = timezone.now()
year = today.year
month = today.month – 1
if month == 0:
year -= 1
month = 12
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(year, month, 1)))
end_day = start_day + datetime.timedelta(30)
return objects.filter(date__range=[start_day, end_day])

def thisYearQuerySet(objects):
today = timezone.now()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, 1, 1)))
end_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year + 1, 1, 1)))
return objects.filter(date__range=[start_day, end_day])

def lastYearQuerySet(objects):
today = timezone.now()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year – 1, 1, 1)))
end_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, 1, 1)))
return objects.filter(date__range=[start_day, end_day])

def lastQuaterQuerySet(objects):
today = timezone.now()
four_month_before = today – timezone.timedelta(30 * 4)
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(four_month_before.year, four_month_before.month, 1)))
return objects.filter(date__gte=start_day)

def getLastWeek():
date = datetime.date.today()
end_day = date – datetime.timedelta(date.weekday())
start_day = end_day – datetime.timedelta(7)
return dateToDatetime([day for day in datespan(start_day, end_day)])

def getThisWeek():
date = datetime.date.today()
start_day = date – datetime.timedelta(date.weekday())
end_day = start_day + datetime.timedelta(7)
return dateToDatetime([day for day in datespan(start_day, end_day)])

def getLastMonth():
today = datetime.date.today()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, today.month – 1 if today.month – 1 != 0 else 1, 1)))
end_day = start_day + datetime.timedelta(30)
return [day for day in datespan(start_day, end_day)]

def getThisMonth():
today = datetime.date.today()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, today.month, 1)))
end_day = start_day + datetime.timedelta(30)
return [day for day in datespan(start_day, end_day)]

def getLastYear():
today = datetime.date.today()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year – 1, 1, 1)))
end_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, 1, 1)))
return [day for day in datespan(start_day, end_day)]

def getThisYear():
today = datetime.date.today()
start_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year, 1, 1)))
end_day = pytz.timezone(‘Asia/Shanghai’).localize((datetime.datetime(today.year + 1, 1, 1)))
return [day for day in datespan(start_day, end_day)]

def dayNotIn(objects):
return objects.filter(~Q(date=timezone.now()))

def weekNotIn(objects):
return objects.filter(date__lt=timezone.now() – datetime.timedelta(days=7))

def monthNotIn(objects):
return objects.filter(date__lt=timezone.now() – datetime.timedelta(days=30))

def yearNotIn(objects):
return objects.filter(date__lt=timezone.now() – datetime.timedelta(days=365))

def getQSbyYM(objects, y, m):
em = m + 1
ey = y
if em == 13:
em = 1
ey = y + 1
start

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar la advertencia de zona horaria, puede usar django.utils.timezone para crear objetos de zona horaria conscientes en lugar de objetos de fecha y hora ingenuos. Aquí hay una versión actualizada de la función thisYearQuerySet que utiliza django.utils.timezone para crear objetos de zona horaria conscientes:

    from django.utils import timezone
    
    def thisYearQuerySet(objects):
        start_day = timezone.make_aware(datetime.datetime(timezone.now().year, 1, 1))
        end_day = timezone.make_aware(datetime.datetime(timezone.now().year, 12, 31))
        return objects.filter(date__range=[start_day, end_day])
    

    Esto creará objetos conscientes de la zona horaria que Django no le advertirá.

    Además, asegúrese de modificar date__ de acuerdo con el nombre del campo de fecha y hora de su modelo, y cambie la zona horaria en función de donde se encuentre su sitio.

Comments are closed.