我只需要获取数据库中存在的上个月的对象。我不是说最近30天或最后一个日历月,而是数据库中记录的最近一个月。。。我已经看到django有latest((函数,它根据给定字段返回表中最近的对象,但我希望它根据给定月份返回多个对象。
revisoes = Revisao.objects.filter(apicultor__in=apicultores).order_by('-data_registro')
这是我正在使用的查询集,只是它返回给定养蜂人的所有修订。我需要它只返回基于data_registro
字段最后一个月的修订。
您可以使用dateutil
包[readthedocs.io]的relativedelta
对象[readthedocs.io]来确定上个月,并使用它来检索上个月的项目:
from dateutil.relativedelta importrelativedelta
from django.utils.timezone import now
revisoes = Revisao.objects.filter(
apicultor__in=apicultores,data_registro__gte=now()-relativedelta(months=1)
).order_by('-data_registro')
或者,如果你想检索自月初以来的项目,你可以使用:
from calendar import monthrange
from datetime import datetime
some_datetime = datetime(2022, 1, 28, 15, 15)
start = some_datetime.date().replace(day=1)
end = some_datetime.date().replace(day=monthrange(some_datetime.year, some_datetime.month)[1])
revisoes = Revisao.objects.filter(
apicultor__in=apicultores,data_registro__range=[start, end]
).order_by('-data_registro')
或者如果data_registro
是DateTimeField
:
from calendar import monthrange
from datetime import datetime
some_datetime = datetime(2022, 1, 28, 15, 15)
start = some_datetime.date().replace(day=1)
end = some_datetime.date().replace(day=monthrange(some_datetime.year, some_datetime.month)[1])
revisoes = Revisao.objects.filter(
apicultor__in=apicultores,data_registro__date__range=[start, end]
).order_by('-data_registro')
解决方案:我解决了以下问题:
meses = [obj.data_registro for obj in revisoes]
ultimo_mes = max(meses)
ultimo_mes = ultimo_mes.strftime("%Y-%m")
revisoes_recentes = Revisao.objects.filter(apicultor__in=apicultores, data_registro__contains=ultimo_mes)