How to get data between date range in django rest_framework?

Viewed 1129

I want to fetch some data between two dates, but got an error that is "AttributeError: 'str' object has no attribute 'values'". How I solve this issue?

views.py

class TestView(APIView):
    def get(self, request):
        user_obj = Payload.objects.all()
        usr = self.request.user
        print(usr)
        user_data = TestSerializer(user_obj, many=True)
        return Response({'status':'success'})    

    def post(self, request):
        serializers = TestSerializer(data=request.data)
        if serializers.is_valid(raise_exception=True):
            start_date = serializers.validated_data['start_date']
            end_date = serializers.validated_data['end_date']
            user_id = serializers.validated_data['user_id']
            user_obj = Payload.objects.filter(user=user_id, timestamp__gte=start_date,timestamp__lte=end_date)
            sr = TestModelSerializer(user_obj, many=True)
            return Response({'status':sr.data}, status = status.HTTP_200_OK)
        else:
            print(serializers.errors,"errors")

serializers.py

class TestSerializer(serializers.Serializer):
    user_id = serializers.IntegerField()
    start_date = serializers.DateTimeField()
    end_date = serializers.DateTimeField()

class TestModelSerializer(serializers.ModelSerializer):
    model = Payload
    fields = '__all__'

models.py

class Payload(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True, blank=False)
    input_values = models.CharField(max_length=20) 

    def __str__(self):
        return self.input_values

trackback enter image description here

4 Answers

I think that timestamp__gte should be datetime object. Like in this example.

Im not sure that serializer datetime fields returns string or datetime object, but error tell that is string.

from datetime import datetime, timedelta

date_filter = dict(created__gte=datetime.now() - timedelta(30), created__lte=datetime.now()) 

you can filter more customize 
start_date = '2021-05-21'
end_date = '2021-05-24'
date_filter = dict(created__gte=start_date), created__lte=end_date)

objs  = Klash.objects.filter(**date_filter) # Klash = your model name 

You can try with this.

Payload.objects.filter(user=user_id, timestamp__range=[start_date,end_date]

Okay, that was not obvious at all, but I've figured it out. So the error says 'str' object has no attribute 'values'. According to the traceback, the line in question is for field in self.fields.values(), where self is the instance of TestModelSerializer.

Taking a closer look, there is a mistake in the serializer definition, which sets fields = '__all__', and '__all__' is the string which raises an error. The proper definition should be

class TestModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Payload
        fields = '__all__'
Related