Django Rest Framework를 사용하여 나머지 API를 작성 중입니다. POST 메서드에서 개체를 생성하는 엔드 포인트가 있으며이 메서드는 대량 추가를 허용하기 위해 재정의됩니다. 그러나 객체는 Pacient와 Symptoms 사이의 "중간 테이블"이며이를 생성하기 위해서는 증상에 대한 pacient 객체 또는 ID와 동일한 정보를 제공해야합니다. 요청에서 Symptom id를 얻었으므로 문제가되지는 않지만 인증 된 사용자 (요청하는 사람)입니다. 이제이를 수행하기 위해 serializer에서 create 메서드를 어떻게 편집합니까?
내 견해는 다음과 같습니다.
class PacienteSintomaViewSet(viewsets.ModelViewSet):
serializer_class = SintomaPacienteSerializer
queryset = SintomaPaciente.objects.all()
permission_classes = (IsAuthenticated, )
http_method_names = ['post', 'get']
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = SintomaPacienteSerializer(data=request.data, many=many)
if serializer.is_valid():
sintomas_paciente_lista = [SintomaPaciente(**data) for data in serializer.validated_data]
print(serializer.validated_data)
SintomaPaciente.objects.bulk_create(sintomas_paciente_lista)
return Response(serializer.data, status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
그리고 이것은 내 직렬 변환기입니다.
class SintomaPacienteSerializer(serializers.ModelSerializer):
def create(self, validated_data):
sintoma_paciente = SintomaPaciente.objects.create(
sintoma_id=self.validated_data['sintoma_id'],
paciente_id=THIS NEEDS TO BE FILLED,
data=self.validated_data['data'],
intensidade=self.validated_data['intensidade'],
)
return sintoma_paciente
class Meta:
model = SintomaPaciente
fields = ('id', 'sintoma_id', 'paciente_id', 'intensidade', 'data',
'primeiro_dia', 'ativo')
두 가지 방법이 있습니다. 첫째, 컨텍스트 내에서 사용자를 serializer에 전달하고 serializer에서 사용할 수 있습니다.
당신의 관점에서 :
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = SintomaPacienteSerializer(data=request.data, many=many,context={'user':request.user})
직렬 변환기에서이 사용자에 액세스 할 수 있습니다. self.context['user']
두 번째 방법은 사용자를 serializer에 다시 전달할 필요가 없습니다. 또한 View에서 create 메서드를 이미 재정의 한 경우 serializer에서 create 메서드를 재정의 할 필요가 없습니다. 논리적으로 잘못되었다고 생각합니다. 어쨌든 뷰에서 개체를 만들 때 사용자를 사용할 수 있습니다.
def create(self, request, *args, **kwargs):
many = True if isinstance(request.data, list) else False
serializer = SintomaPacienteSerializer(data=request.data, many=many)
if serializer.is_valid():
sintomas_paciente_lista = [SintomaPaciente(**data,paciente_id=request.user.id) for data in serializer.validated_data]
print(serializer.validated_data)
....
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다