简体   繁体   English

如何根据小时范围过滤 django 查询集?

[英]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个静态过滤器参数:

  1. filter list upto 3 hr过滤列表长达 3 小时
  2. filter list between 3 to 12hr 3 到 12 小时之间的过滤列表
  3. filter list above 12 hr超过 12 小时的过滤器列表

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM