如何使用queryset django仅获取数据库中存在的上个月的记录?



我只需要获取数据库中存在的上个月的对象。我不是说最近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_registroDateTimeField:

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)

相关内容