Как отфильтровать набор запросов 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))
# …