"Получена ошибка KeyError при попытке получить значение для поля `pet_name` на сериализаторе `PatientSerializer`.

Я пытаюсь получить самый популярный тип домашнего животного с помощью viewsets в django, но когда я пишу этот код

class PopularPetTypeViewSet(viewsets.ModelViewSet):
    queryset = models.Patient.objects.all()
    serializer_class = serializers.PatientSerializer

    def get_queryset(self):
        try:
            return models.Patient.objects.values('pet_type').annotate(count=Count('pet_type')).order_by('-count')
        except Exception as e:
            return Response({'error':str(e)})

я получаю эту ошибку

"Got KeyError when attempting to get a value for field `pet_name` on serializer `PatientSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'pet_name'."

my models.py

from django.db import models
from django.utils.translation import gettext_lazy as _

# Create your models here.
class Patient(models.Model):

    pet_name = models.CharField(max_length=255)
    cat = 'cat'
    dog = 'dog'
    bird = 'bird'
    PET_TYPE_CHOICES = [
        (cat, cat),
        (dog, dog),
        (bird, bird),
    ]
    pet_type = models.CharField("Select Pet Type", choices=PET_TYPE_CHOICES, null=False, max_length=15)
    owner_name = models.CharField("Owner Name",max_length=255)
    owner_address = models.CharField("Owner Address", max_length=255, null=True, blank=True)
    owner_phone_number = models.CharField("phone", max_length=11, blank=False, default='')
    
    
    def __str__(self):
        return str(self.id)
    
    
class PatientAppointment(models.Model):
    patient_id = models.ForeignKey(Patient, on_delete=models.DO_NOTHING, null=True) #, null=TrueSS)
    appointment_start_time = models.DateTimeField(_("Appointment start time"), auto_now=False, auto_now_add=False)
    appointment_end_time = models.DateTimeField(_("Appointment end time"), auto_now=False, auto_now_add=False)
    description = models.CharField(_("Enter description"), max_length=1024)
    USD = 'USD'
    EUR = 'EUR'
    BITCOIN = 'BITCOIN'
    PAYMENT_TYPE_CHOICES = [
        (USD, USD),
        (EUR, EUR),
        (BITCOIN, BITCOIN),
    ]
    payment_type = models.CharField("Select payment Type", choices=PAYMENT_TYPE_CHOICES, null=False, max_length=15, default='USD')
    paid_amount = models.DecimalField(_("Enter amount paid"), max_digits=5, decimal_places=2, null=True)
    unpaid_amount = models.DecimalField(_("Enter unpaid amount"), max_digits=5, decimal_places=2, null=True)
    total_amount = models.DecimalField(_("Enter Total amount"), max_digits=5, decimal_places=2, null=True)
    
    
    def __str__(self):
        return str(self.id)

serializers.py

from rest_framework import serializers
from .models import Patient, PatientAppointment
# from pets_hospital.settings import DATETIME_FORMAT

class PatientSerializer(serializers.ModelSerializer):
    class Meta:
        model = Patient
        fields = (
            'id',
            'pet_name',
            'pet_type',
            'owner_address',
            'owner_name',
            'owner_phone_number')
    pet_name = serializers.CharField(required=True)
    pet_type = serializers.CharField(required=True)
    owner_address = serializers.CharField(required=True)
    owner_name = serializers.CharField(required=True)
    owner_phone_number = serializers.CharField(required=True, min_length=9,max_length=11)
    

class PatientAppointmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = PatientAppointment
        fields = (
            'id',
            'appointment_start_time',
            'appointment_end_time',
            'description',
            'payment_type',
            'unpaid_amount',
            'paid_amount',
            'total_amount',
            'patient_id',
            'appointments',
        )
    appointment_start_time = serializers.DateTimeField(required=True)
    appointment_end_time = serializers.DateTimeField(required=True)
    description = serializers.CharField(required=False)
    payment_type = serializers.CharField(required=True)
    paid_amount = serializers.IntegerField(required=True)
    unpaid_amount = serializers.IntegerField(required=True)
    total_amount = serializers.IntegerField(required=True)
    appointments = PatientSerializer(source='patient_id',read_only=True)

Пожалуйста, помогите мне с этой ошибкой, я провел исследование этой ошибки и все они просят указать имя_поля(имя_животного) в сериализаторах, но я уже указал это и получаю ту же ошибку. Спасибо

Думаю, проблема в том, что ваш метод get_queryset возвращает QuerySet словари, а не экземпляры модели (см. .values()). Это ModelViewSet, поэтому он должен возвращать QuerySet экземпляров модели (как models.Patient.objects.all()).

Также наличие обоих определений queryset и get_queryset() является избыточным, вам нужно только одно или другое. Попробуйте удалить get_queryset() и проверьте, работает ли это.

Вернуться на верх