Ошибка типа: объект типа '_Serializer' не JSON сериализуемый - PullRequest
0 голосов
/ 28 апреля 2020

Я новее в Django остальные API. Мой код ниже:

class PatientViewSet(viewsets.ModelViewSet):
queryset = Patient.objects.all()
serializer_class = PatientSerializer
filter_backends = (DjangoFilterBackend, filters.OrderingFilter)
filterset_fields = ['id', 'email', 'mobile', 'status', 'type', 'gender']
ordering_fields = ['id', 'name']

def get_queryset(self):
    queryset = Patient.objects.all()
    status = self.request.query_params.get('status')
    name = self.request.query_params.get('name')
    if not status:
        queryset = queryset.exclude(status="DELETE")
    if name:
        queryset = queryset.filter(name__icontains=name)
    return queryset

def retrieve(self, request, pk=None):
    queryset = Patient.objects.all()
    patient = get_object_or_404(queryset, pk=pk)
    serializer = PatientSerializer(patient)

    summary = dict()
    summary['payment'] = list(PatientPayment.objects.filter(patient_id=pk).aggregate(Sum('amount')).values())[0]
    summary['appointment'] = DoctorAppointment.objects.filter(patient_id=pk).count()

    d_appoint = DoctorAppointment.objects.filter(patient__id=pk).last()
    appoint_data = DoctorAppointmentSerializer(d_appoint)

    summary['last_appointment'] = appoint_data

    content = {"code": 20000, "data": serializer.data, "summary": summary}
    return Response(content)

Вот URL-адрес:

http://127.0.0.1:8000/api/patients/2/

Когда я бегу в почтальоне, появляется сообщение об ошибке:

TypeError at / API / пациентов / 2 / Объект типа «DoctorAppointmentSerializer» не JSON Сериализуемый

Здесь проблема с фрагментом кода:

d_appoint = DoctorAppointment.objects.filter(patient__id=pk).last()
appoint_data = DoctorAppointmentSerializer(d_appoint)

Мой вопрос, как я могу получить мой результат?

DoctorAppointmentSerializer Класс:

class DoctorAppointmentSerializer(serializers.HyperlinkedModelSerializer):
patient = PatientSerializer(read_only=True)
patient_id = serializers.IntegerField()
doctor = DoctorSerializer(read_only=True)
doctor_id = serializers.IntegerField()
doc_image = Base64ImageField(
    allow_null=True, max_length=None, use_url=True, required=False
)
doc_file = Base64ImageField(
    allow_null=True, max_length=None, use_url=True, required=False
)

class Meta:
    model = DoctorAppointment
    fields = ['id', 'name', 'mobile', 'problem', 'age', 'gender', 'description', 'doctor', 'doctor_id', 'patient',
              'patient_id', 'advice', 'doc_image', 'doc_file', 'created_at']

1 Ответ

1 голос
/ 28 апреля 2020

Вы должны вызвать .data свойство DoctorAppointmentSerializer класс

appoint_data = DoctorAppointmentSerializer(d_appoint)<b>.data</b>
                                                  ^^^^^^
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...