[英]How to filter django queryset based on hours range?
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__"
In the api there are 3 static filter parameters: api中有3个静态过滤器参数:
How can I filter below api based on the hour that has been calulated in the above serializer ?如何根据上述序列化程序中计算的小时数过滤以下 api ?
For example if I filter by upto3 then the list should return all the objects having hr less or equal to 3.例如,如果我按 upto3 过滤,则列表应返回 hr 小于或等于 3 的所有对象。
The below way returns if the hours matches the exact value only.如果小时数仅与确切值匹配,则以下方式返回。
@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
EDIT:编辑:
I want a filter like this .我想要一个这样的过滤器。
upto_3h = request.GET.get("upto_3hr", False)
if upto_3h:
# filter which has hour less or equal to 3h
between_3_to_12 = request.GET.get("between_3_to_12", False)
if between_3_to_12:
# filter accordingly
above_12 = request.GET.get("above_12", False)
if above_12:
# filter accordingly
You can filter with:您可以使用以下方式过滤:
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))
# …
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.