Getting an AttributeError using RetrieveUpdateDestroyAPIView

121 Views Asked by At

I am new to django and am using mongoengine. I am trying to create an employee database using DRF. All of the APIs are working well but whenever I am trying to fetch a single document which has been deleted its giving me an AttributeError at employee/<int:pk>.

This is my models.py file:-

from mongoengine import Document, SequenceField, StringField, IntField, EmailField from enum import Enum from rest_framework.exceptions import ValidationError

class GenderEnums(str, Enum):
    MALE = "Male" 
    FEMALE = "Female" 
    OTHER = "Other"
    
    @classmethod
    def choices(cls):
    return [item.value for item in cls]

models.py:-

class Employee(Document): 
    employee_id = SequenceField(required=False, primary_key=True) 
    name = StringField(required=True, max_length=50) 
    age = IntField(required=True, min_value=18, max_value=50) 
    company = StringField(required=True, max_length=50) 
    gender = StringField(choices=GenderEnums.choices(), default=GenderEnums.OTHER) 
    email = EmailField(required=True, unique=True) 
    password = StringField(required=True)

    def clean(self):
        if self.gender == GenderEnums.MALE.value and self.age > 30:
            raise ValidationError("For male employees, age should be under 31")
        elif self.gender == GenderEnums.FEMALE.value and self.age < 20:
            raise ValidationError("For female employees, age should be above 20")

serializers.py:-

from rest_framework_mongoengine import serializers 
from .models import Employee 

class EmployeeSerializer(serializers.DocumentSerializer):     
    class Meta:         
        model = Employee         
        fields = "__all__" 

views.py:-

from .serializers import EmployeeSerializer
from .models import Employee
from rest_framework.response import Response
from rest_framework_mongoengine import generics
import logging
from rest_framework.exceptions import ValidationError
from mongoengine import DoesNotExist
import time

logging.basicConfig(filename="logs.txt", filemode="a", level=logging.INFO)

# GeneralSerializer.Meta.model = Employee
# serializer_used = GeneralSerializer


class EmployeeAdd(generics.CreateAPIView):
    try:
        serializer_class = EmployeeSerializer
        logging.info(f"Document created successfully at {time.ctime()}")

    except ValidationError as e:
        Response(f"Validation error: {e}")
    except Exception as e:
        logging.error(f"Error occurred: {e}")
        Response(f"An error occurred while creating the document")


class EmployeeAll(generics.ListAPIView):
    serializer_class = EmployeeSerializer
    queryset = Employee.objects.all()

    def get_queryset(self):
        queryset = self.queryset
        params = self.request.query_params
        if "name" in params:
            queryset = queryset.filter(name=params["name"])
        if "age" in params:
            queryset = queryset.filter(age=params["age"])
        return queryset


class EmployeeOne(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = EmployeeSerializer
    lookup_field = "pk"
    queryset = Employee.objects.all()

    def get_object(self):
        try:
            queryset = self.get_queryset()
            obj = queryset.get(pk=self.kwargs[self.lookup_field])
            return obj
        except Exception as e:
            logging.error(
                f"Failed to retrieve document with the ID {self.kwargs[self.lookup_field]}"
            )
            return Response(
                {"detail": "An error occurred while processing your request."}, status=500
            )

    def update(self, request, *args, **kwargs):
        try:
            response = super().update(request, *args, **kwargs)
            logging.info(
                f"Successfully updated document with ID {kwargs[self.lookup_field]}"
            )
            return response
        except ValidationError as e:
            logging.error(
                f"Failed to update document with ID {kwargs[self.lookup_field]} due to validation error: {e}"
            )
            return Response({"detail": e.detail}, status=e.status_code)
        except DoesNotExist:
            return Response({"detail": "Document not found."}, status=404)
        except Exception as e:
            logging.error(
                f"Failed to update document with ID {kwargs[self.lookup_field]} due to an error: {e}"
            )
            return Response(
                {"detail": "An error occurred while processing your request."}, status=500
            )

    def destroy(self, request, *args, **kwargs):
        try:
            response = super().destroy(request, *args, **kwargs)
            logging.info(
                f"Successfully deleted document with ID {kwargs[self.lookup_field]}"
            )
            return Response(
                f"Successfully deleted document with ID {kwargs[self.lookup_field]}"
            )
        except DoesNotExist:
            return Response({"detail": "Document not found."}, status=404)
        except Exception as e:
            logging.error(
                f"Failed to delete document with ID {kwargs[self.lookup_field]} due to an error: {e}"
            )
            return Response(
                {"detail": "An error occurred while processing your request."}, status=500
            )
from django.urls import path from .views import EmployeeAdd, EmployeeAll, EmployeeOne

urlpatterns = [ path("register", EmployeeAdd.as_view()), path("employees", EmployeeAll.as_view()), path("employee/<int:pk>", EmployeeOne.as_view()), ]

Any help would be very much appreciated. Thank you.

I tried using serializer, serializer_class changed the methods but still getting the AttributeError: AttributeError: "Got AttributeError when attempting to get a value for field nameon serializerEmployeeSerializer. The serializer field might be named incorrectly and not match any attribute or key on the Response instance. Original exception text was: 'Response' object has no attribute 'name'."

0

There are 0 best solutions below