Как отфильтровать набор запросов django на основе диапазона часов?

class MyModelSerializer(serailizers.ModelSerializer):
        hour = serializers.SerializerMethodField()

        def get_hour(self, obj):
           created_at = obj.created_at # datetime
           now = datetime.now()
           return (now - datetime).total_seconds() // 3600
         
        class Meta:
           model = MyModel
           fields = "__all__"

В api есть 3 статических параметра фильтра:

  1. список фильтров до 3 часов
  2. список фильтров от 3 до 12 часов
  3. список фильтров свыше 12 часов

Как я могу фильтровать нижеприведенный api на основе часа, который был рассчитан в вышеприведенном сериализаторе?

Например, если я фильтрую по upto3, то список должен возвращать все объекты с hr меньше или равным 3.

Нижеприведенный способ возвращает, если часы совпадают только с точным значением.

 @api_view(["GET"])
 def get_list(request):
     qs = MyModel.objects.all()
     hr = request.GET.get("hr")
     if hr:
         hr = int(hr)
         frm = now() - timedelta(hours=hr+1)
         to = now() - timedelta(hours=hr)
         qs = qs.filter(created_at__range=(frm, to))
         return MyModelSerializer(qs, many=True).data 

Вы можете фильтровать с помощью:

from datetime import timedelta
from django.db.models.functions import Now

if request.GET.get('upto_3hr'):
    qs = qs.filter(created_at__gte=Now()-timedelta(hours=3))
elif request.GET.get('between_3_to_12'):
    qs = qs.filter(created_at__range=(
        Now()-timedelta(hours=12), Now()-timedelta(hours=3))
    )
elif request.GET.get('above_12'):
    qs = qs.filter(created_at__lte=Now()-timedelta(hours=12))
# …
Вернуться на верх