Как отфильтровать набор запросов 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 статических параметра фильтра:
- список фильтров до 3 часов
- список фильтров от 3 до 12 часов
- список фильтров свыше 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))
# …