在 many=True 序列化器视图集上获取经过身份验证的用户
Get Authenticated user on many=True serializer Viewset
我正在使用 Django Rest Framework 编写 rest api,我有一个在 POST 方法上创建对象的端点,为了允许批量添加,此方法被覆盖。但是,该对象是 Pacient 和 Symptoms 之间的 "intermediate table",为了创建它,我需要为症状提供 pacient 对象或 ID 以及相同的对象。我在请求中获得了症状 ID,所以这不是问题,但是 pacient 是经过身份验证的用户(发出请求的人)。现在,我该如何编辑序列化程序中的创建方法才能做到这一点?
这是我的观点:
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')
有两种方法。
第一个,您可以将用户传递给上下文中的序列化程序,并在序列化程序中使用它:
在您看来:
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']
访问此用户
第二种方式,你不需要再次将用户传递给序列化器。此外,如果您已经在视图中覆盖了 create 方法,则无需在序列化程序中覆盖 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)
....
我正在使用 Django Rest Framework 编写 rest api,我有一个在 POST 方法上创建对象的端点,为了允许批量添加,此方法被覆盖。但是,该对象是 Pacient 和 Symptoms 之间的 "intermediate table",为了创建它,我需要为症状提供 pacient 对象或 ID 以及相同的对象。我在请求中获得了症状 ID,所以这不是问题,但是 pacient 是经过身份验证的用户(发出请求的人)。现在,我该如何编辑序列化程序中的创建方法才能做到这一点?
这是我的观点:
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')
有两种方法。 第一个,您可以将用户传递给上下文中的序列化程序,并在序列化程序中使用它:
在您看来:
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']
第二种方式,你不需要再次将用户传递给序列化器。此外,如果您已经在视图中覆盖了 create 方法,则无需在序列化程序中覆盖 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)
....