How to filter django models data by Date and id using Django Restframwork?

Viewed 135

I am Using Django Rest Frame Work and I Want to build filter time by date and id

urls.py

path('health-heartrate/',healthHeartRate,name='health-heart-rate')

Time Field in Database : 2016-03-29 00:00:05.000000

views.py

@api_view(['GET'])
def  healthHeartRate(request):
    if request.method=='GET':

        strDate=request.query_params.get('strDate',None)
        strDate=datetime.datetime.strptime(strDate, "%Y-%m-%d").date()

        endDate=strDate + datetime.timedelta(days=1)
        filter_date=Health.objects.filter(pk=id).filter(time_gte=strtDate).filter(time_lte=endDate)

        serializer=HealthFilterSerializer(filter_date,many=True)
        return Response(serializer.data)
  

Url > http://127.0.0.1:8000/api/v1/health-heartrate/?id=1&strDate=2016-03-28

I got the Following Error in Browser

TypeError at /api/v1/health-heartrate/
int() argument must be a string, a bytes-like object or a number, not 'builtin_function_or_method'
2 Answers

id refers to the builtin id function [python-doc]. You need ot obtain this parameter, for example with:

@api_view(['GET'])
def  healthHeartRate(request):
    pk = request.query_params.get('id')
    str_data = request.query_params.get('strDate')
    start_date = datetime.datetime.strptime(strDate, '%Y-%m-%d').date()

    end_date = start_date + datetime.timedelta(days=1)
    filter_date = Health.objects.filter(
        pk=pk,
        time__gte=start_date,
        time__lte=end_date
    )
    serializer=HealthFilterSerializer(filter_date,many=True)
    return Response(serializer.data)

The lookups can be accessed with a double underscore, so __gte, not _gte.

You can reduce your view into a much simpler version as,

@api_view(['GET'])
def healthHeartRate(request):
    if request.method == 'GET':
        date_input = request.query_params.get('strDate', None)
        pk = request.query_params.get('id')
        health_qs = Health.objects.filter(pk=pk, time__date=date_input)
        serializer = HealthFilterSerializer(health_qs, many=True)
        return Response(serializer.data)
Related