"Получена ошибка 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()
и проверьте, работает ли это.