首页 > 解决方案 > 如何在 django 的序列化器字段中设置上下文值?

问题描述

我有这些模型

class Patient(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Doctor(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)


class Visit(models.Model):
    patient = models.ForeignKey(
        'Patient',
        on_delete=models.CASCADE,
    )
    doctor = models.ForeignKey(
        'doctor.Doctor',
        on_delete=models.CASCADE,
    )
    date = models.DateField(auto_now=False, auto_now_add=False)
    time = models.TimeField(auto_now=False, auto_now_add=False)
    title = models.CharField(max_length=100)
    detail = models.TextField()

而这个序列化器:

class VisitSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Visit
        fields = '__all__'

我在视图中从 db 中查询了患者和医生,并希望将它们发送到序列化程序:

@api_view(['POST', ])
@permission_classes((IsAuthenticated, ))
def add_visit_view(request, doctor_pk):
    try:
        patient = Token.objects.get(key=request.auth.key).user
        doctor = Doctor.objects.get(pk=doctor_pk)
    except Patient.DoesNotExist:
        return Response(data={'error': 'patient does not exist.'}, status=status.HTTP_404_NOT_FOUND)
    except Doctor.DoesNotExist:
        return Response(data={'error': 'doctor does not exist.'}, status=status.HTTP_404_NOT_FOUND)

    user = request.user
    if patient != user:
        return Response({'error': 'user and patient do not match'}, status=status.HTTP_400_BAD_REQUEST)

    context = {
        'doctor': doctor,
        'patient': patient
    }
    serializer = VisitSerializer(data=request.data, context=context)
    data = {}
    if serializer.is_valid():
        patient = serializer.save()
        data['message'] = 'visit added successfully'
    else:
        data = serializer.errors

    return Response(data)

我知道我必须使用上下文字段发送额外的数据,但是如何在序列化程序中设置它们
我覆盖了这样的创建方法:

def create(self, validated_data):
            visit = Visit(
                patient=self.context['patient'],
                doctor=self.context['doctor'],
                date=self.validated_data['date'],
                time=self.validated_data['time'],
                title=self.validated_data['title'],
                detail=self.validated_data['detail']
            )
            visit.save()
            return visit

但是当我发送请求时,它说医生和患者字段仍然需要
我该怎么办?

标签: pythondjangodjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


推荐阅读