Django rest framework 将url变量从APIView类传递到序列化程序的方法

Django rest framework 将url变量从APIView类传递到序列化程序的方法,django-rest-framework,Django Rest Framework,我需要将变量传递给url,并将它们传递给序列化程序进行进一步处理。我知道如何在视图中处理这些变量,但不知道如何在序列化程序中处理 url.py path('upload_excel_rfi/<str:rfiid>/<int:vendor>/<int:analyst>/', UploadElementFromExcelFile.as_view() class UploadElementFromExcelFile(APIView): serializer

我需要将变量传递给url,并将它们传递给序列化程序进行进一步处理。我知道如何在视图中处理这些变量,但不知道如何在序列化程序中处理

url.py

path('upload_excel_rfi/<str:rfiid>/<int:vendor>/<int:analyst>/', UploadElementFromExcelFile.as_view()
class UploadElementFromExcelFile(APIView):
    serializer_class = ElementCommonInfoSerializer

def post(self, request, *args, **kwargs):
    # GET VARIABLES
    rfiid = kwargs.get('rfiid')
    vendor = kwargs.get('vendor')
    analyst = kwargs.get('analyst')
    data = request.data  # response data is list of dict
    try:
        # implement transaction  - if exception appear during for loop iteration none data save to DB
        with transaction.atomic():
            ....some logic
            serializer.is_valid(raise_exception=True)
            serializer.save()
    except ValidationError:
        return Response({"errors": (serializer.errors,)},
                        status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(request.data, status=status.HTTP_200_OK)
class ElementCommonInfoSerializer(serializers.ModelSerializer):

    class Meta:
        model = Elements
        fields = ("...")

    def create(self, validated_data):
        .....
        return self
序列化程序.py

path('upload_excel_rfi/<str:rfiid>/<int:vendor>/<int:analyst>/', UploadElementFromExcelFile.as_view()
class UploadElementFromExcelFile(APIView):
    serializer_class = ElementCommonInfoSerializer

def post(self, request, *args, **kwargs):
    # GET VARIABLES
    rfiid = kwargs.get('rfiid')
    vendor = kwargs.get('vendor')
    analyst = kwargs.get('analyst')
    data = request.data  # response data is list of dict
    try:
        # implement transaction  - if exception appear during for loop iteration none data save to DB
        with transaction.atomic():
            ....some logic
            serializer.is_valid(raise_exception=True)
            serializer.save()
    except ValidationError:
        return Response({"errors": (serializer.errors,)},
                        status=status.HTTP_400_BAD_REQUEST)
    else:
        return Response(request.data, status=status.HTTP_200_OK)
class ElementCommonInfoSerializer(serializers.ModelSerializer):

    class Meta:
        model = Elements
        fields = ("...")

    def create(self, validated_data):
        .....
        return self
我发现有人提到了
def get\u serializer\u context(self)
,但据我所知,此方法不用于APIView。您介意告诉我如何正确地传递附加变量吗?我现在讨论如何向序列化程序添加额外变量
context={}

context = {"rfiid": kwargs.get('rfiid')}
serializer = BlaBlaSerializer(data=data, context=context)

但是我想知道是否还有另一种更适合的方法。

序列化程序\u类在DRF的
APIView
中没有任何作用。 您可以向序列化程序传递其他上下文,如下所示:

serializer=ElementCommonInfoSerializer(数据=数据,上下文={'request':request})
然后在序列化程序中

class ElementCommonInfoSerializer(serializers.ModelSerializer):
类元:
模型=元素
字段=(“…”)
def创建(自我验证的_数据):
request=self.context.get('request')
...
回归自我

我知道这一点,我在一个问题中写道。他真的是唯一一个吗?如果没有其他选项,我会将您的标记为答案)您可以使用
serializer.create(serializer.validated_data,param1,param2)
并重载序列化程序
create
函数。根据问题中提供的内容,这是正确的方法。