Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取many=True序列化程序视图集上经过身份验证的用户_Python_Django_Api_Django Rest Framework_Django Rest Viewsets - Fatal编程技术网

Python 获取many=True序列化程序视图集上经过身份验证的用户

Python 获取many=True序列化程序视图集上经过身份验证的用户,python,django,api,django-rest-framework,django-rest-viewsets,Python,Django,Api,Django Rest Framework,Django Rest Viewsets,我正在使用Django rest框架编写一个rest api,我有一个端点在POST方法上创建对象,这个方法被重写以允许批量添加。但是,该对象是Pacient和Symptoms之间的“中间表”,为了创建它,我需要为symptom提供Pacient对象或id以及相同的id。我在请求中获得症状id,因此这不是问题,但是pacient是经过身份验证的用户(发出请求的用户)。现在,我如何在序列化程序中编辑create方法才能做到这一点 以下是我的看法: class PacienteSintomaView

我正在使用Django rest框架编写一个rest api,我有一个端点在POST方法上创建对象,这个方法被重写以允许批量添加。但是,该对象是Pacient和Symptoms之间的“中间表”,为了创建它,我需要为symptom提供Pacient对象或id以及相同的id。我在请求中获得症状id,因此这不是问题,但是pacient是经过身份验证的用户(发出请求的用户)。现在,我如何在序列化程序中编辑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')

有两条路。 首先,您可以在上下文中将用户传递给序列化程序,并在序列化程序中使用它:

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)
        ....
有两条路。 首先,您可以在上下文中将用户传递给序列化程序,并在序列化程序中使用它:

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)
        ....