Django-rest-framework IF statement in post method is not executing

Question:

(I will provide full code at the bottom)

I am trying to create an API view with django rest framework. I wanted to create a login API so I was first testing out on how to check if a data exists in a field in the database. Here are the "fields = values" that I want to check that actually exists in the database:

  • pengerja_id = 123 //correct data

  • password = 123

Now for example I want to try inputting the wrong value:

  • pengerja_id = 555 //wrong data

  • password = 555

Now, I run an if queryset.exists() statement. Whenever I gave pengerja_id a wrong value like ‘555’ it executes the else statement as queryset returns false. But whenever I gave it the correct value of ‘123’, It fails to execute the WHOLE code for some reason starting from if serializer.is_valid().

Here is the code inside view.py

class AuthorizeMemberView(APIView):
    serializer_class = AuthorizeMemberSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)

        if serializer.is_valid():
            pengerja_id = serializer.data.get('pengerja_id')
            password = serializer.data.get('password')
            print(f'pengerja_id={pengerja_id}, password={password}')
            
            queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)

            if queryset.exists():
                return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
            else:
                return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
            
        return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)
    

Here is the code inside serializers.py

class AuthorizeMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = COOL_YOUTH_MEMBER
        fields = ('pengerja_id', 'password')

The results are whenever I entered ‘123’ it gives me the HTTP_400_BAD_REQUEST. Whenever I entered something else for example ‘555’, it gives me the HTTP_404_NOT_FOUND response which means the else statement works.

This is what I’ve tried so far:

First is to print out to check which block of code that isn’t executed when I passed in the correct value of pengerja_id = ‘123’ from my database.

class AuthorizeMemberView(APIView):
    serializer_class = AuthorizeMemberSerializer

    def post(self, request, format=None):
        print(f'serializer_class={self.serializer_class}') # this is executed
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            print(serializer.is_valid()) # this is not executed
            pengerja_id = str(serializer.data.get('pengerja_id'))
            password = serializer.data.get('password')
            print(f'pengerja_id={pengerja_id}, password={password}')
            
            queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
            print('Checking queryset exists()')
            print(queryset.query)
            if queryset.exists():
                print("User Verified")
                return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
            else:
                print('not found')
                return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
            
        return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)

Everything from print(serializer.is_valid()) below is not executed. But if I gave in the value of ‘555’(wrong value) everything is executed until return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND).

Here is the output in the terminal.

Value of anything else other than ‘123’ output

Value of ‘123’ ouput

So what went wrong here? Is it some kind of bug that django has or am I missing something here?

This is the full code below

models.py

from django.db import models
import mysql.connector

# Create your models here.
class COOL_YOUTH_MEMBER(models.Model):
    pengerja_id = models.CharField(max_length=255, unique=True, primary_key=True)
    nomor_telepon = models.CharField(max_length=255, unique=True)
    password = models.CharField(max_length=255)
    nama_cool = models.CharField(max_length=255)
    tempat_lahir = models.CharField(max_length=255)
    tanggal_lahir = models.DateField(null=True)
    status_pekerjaan = models.CharField(max_length=255)
    domisili = models.CharField(max_length=255)
    user_session_key = models.CharField(max_length=255, null=True)

serializers.py

from rest_framework import serializers
from .models import COOL_YOUTH_MEMBER

class ShowMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = COOL_YOUTH_MEMBER
        fields = ('pengerja_id','nomor_telepon','password','nama_cool','tempat_lahir',
                  'tanggal_lahir', 'status_pekerjaan', 'domisili', 'user_session_key')

class InsertNewMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = COOL_YOUTH_MEMBER
        fields = ('pengerja_id','nomor_telepon','password')
                #   ,'nama_cool','tempat_lahir',
                #   'tanggal_lahir', 'status_pekerjaan', 'domisili')

class AuthorizeMemberSerializer(serializers.ModelSerializer):
    class Meta:
        model = COOL_YOUTH_MEMBER
        fields = ('pengerja_id', 'password')

views.py

from django.shortcuts import render
from django.contrib.auth.backends import BaseBackend
from rest_framework import generics, status
from .serializers import ( 
                    ShowMemberSerializer,
                    InsertNewMemberSerializer,
                    AuthorizeMemberSerializer
                    )
from .models import COOL_YOUTH_MEMBER
from rest_framework.views import APIView
from rest_framework.response import Response

# Create your views here.
# def index(request, *args, **kwargs):
#     return render(request, index.html)

class ShowMemberView(generics.ListAPIView):
    queryset = COOL_YOUTH_MEMBER.objects.all()
    serializer_class = ShowMemberSerializer

class InsertNewMemberView(APIView):
    serializer_class = InsertNewMemberSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            pengerja_id = serializer.data.get('pengerja_id')
            nomor_telepon = serializer.data.get('nomor_telepon')
            password = serializer.data.get('password')

            queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
            if not queryset.exists():
                db = COOL_YOUTH_MEMBER(
                    pengerja_id = pengerja_id,
                    nomor_telepon = nomor_telepon,
                    password = password,
                )
                # db.nama_cool = ''
                # db.tempat_lahir = ''
                # db.tanggal_lahir = ''
                # db.status_pekerjaan = ''
                # db.domisili =''
                db.save()
                return Response(ShowMemberSerializer(db).data, status=status.HTTP_202_ACCEPTED)
            else:
                return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_404_NOT_FOUND)
    
        return Response({'Bad request':'Page not valid'}, status=status.HTTP_400_BAD_REQUEST)

class AuthorizeMemberView(APIView):
    serializer_class = AuthorizeMemberSerializer

    def post(self, request, format=None):
        print(f'serializer_class={self.serializer_class}')
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            print(serializer.is_valid())
            pengerja_id = str(serializer.data.get('pengerja_id'))
            password = serializer.data.get('password')
            print(f'pengerja_id={pengerja_id}, password={password}')
            
            queryset = COOL_YOUTH_MEMBER.objects.filter(pengerja_id = pengerja_id)
            print('Checking queryset exists()')
            print(queryset.query)
            if queryset.exists():
                print("User Verified")
                # db = queryset[0]
                # db.pengerja_id = pengerja_id
                # db.password = password
                return Response({'Success':'User Verified'}, status=status.HTTP_202_ACCEPTED)
            else:
                print('not found')
                return Response({'Login Failed':'User not registered'}, status=status.HTTP_404_NOT_FOUND)
            
        return Response({'Bad request':'Data failed to submit'}, status=status.HTTP_400_BAD_REQUEST)

urls.py

from django.urls import path
from .views import (
                ShowMemberView,
                InsertNewMemberView,
                AuthorizeMemberView,
                )

urlpatterns = [
    path('show', ShowMemberView.as_view()),
    path('new-member', InsertNewMemberView.as_view()),
    path('authorize', AuthorizeMemberView.as_view()),
]

Also the class InsertNewMemberView works just fine. Code is almost the same.

Asked By: Lukas

||

Answers:

Before if serializer.is_valid() try this to know what the error is:

print(serialzer.errors)

It will return a dictionary with the errors

Answered By: ilyasbbu