How to filter django queryset based on the serializer field value?

Viewed 58

serializer:

class MyModelSerializer(serailizers.ModelSerializer):
        hrs = serializers.SerializerMethodField()
        def get_hrs(self, obj):
           created_at = obj.created_at
           now = datetime.now()
           return (now - datetime).total_seconds() // 3600
         
        class Meta:
           model = MyModel
           fields = "__all__"

Now in the api there will be a filter parameter hr what it need to do is filter the queryset matching this above calculated hr.

For example:

    @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)
        return MyModelSerializer(qs, many=True).data 

I want to get matching result if paramter hr=get_hrs() value.

How can I filter like this from serializer fields?

1 Answers

You have the wrong placement:

class MyModelSerializer(serailizers.ModelSerializer):         
    class Meta:
       model = MyModel
       fields = "__all__"
    hrs = serializers.SerializerMethodField()

    def get_hrs(self, obj):
       datetime = SomeModel.objects.filter(id=obj.id).last().datetime
       now = datetime.now()
       return (now - datetime).total_seconds() // 3600
Related