如何过滤django queryset基于小时范围?


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 

编辑:

我想要一个这样的滤镜。

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

您可以使用:

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))
# …

最新更新