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

Serializer

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

В api будет параметр фильтра hr. Если в нем указано, например, 4, то я должен вернуть только те совпадающие записи, которые имеют час 4 (вычисленный в приведенном выше сериализаторе).

Как я могу это сделать?

    @api_view(["GET"])
    def get_list(request):
        qs = MyModel.objects.all()
        hr = request.GET.get("hr")
        if hr:
            qs = qs.filter(created_at__hour=hr) # get_hour value = hr this should be the comparison
        return MyModelSerializer(qs, many=True).data 

Вы можете вычислить обратно две временные метки, между которыми количество часов равно четырем, таким образом:

from datetime import timedelta
from django.utils.timezone import now

hr = request.GET.get('hr')
nw = now()
if hr:
    hr = int(hr)
    frm = nw - timedelta(hours=hr+1)
    to = nw - timedelta(hours=hr)
    qs = qs.filter(created_at__range=(frm, to))
# …
Вернуться на верх