在 Patch 之后,我在序列化器中的请求得到了一个 None 类型

I am getting a None type for my request in serializer after Patch

我正在进行一项测试,部分更新或修补我的产品模型中的某些字段。我应该能够更新我的产品模型中的任何字段。在我的序列化程序中,我有一个来自请求对象的 url 构建器。但是,request 没有在我的序列化器上传递,或者它是 None 类型。因此,我得到一个错误:AttributeError: 'NoneType' object has no attribute 'build_absolute_uri'

如何将请求传递给我的序列化程序?

def test_patch_products(self):
    data = {
    'description': 'This is an updated description.',
    'type': 'New'
    }
    ...
    ...
    response = self.client.patch('/data/products/1/',
        data=data, format='json')

在我看来:

def partial_update(self, request, pk=None):
    product= get_object_or_404(Product, pk=pk)

    serializer = ProductSerializer(product,
        data=self.request.data, partial=True,
        )

    if serializer.is_valid():
        serializer.save(uploaded_by=self.request.user)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

在我的序列化程序中:

class ProductSerializer(serializers.ModelSerializer):
    uploaded_by= serializers.StringRelatedField()
    thumbnail = serializers.SerializerMethodField()

    class Meta:
        model = CaptureGroup
        fields = ('__all__')

    def get_thumbnail(self, object):
        request = self.context.get('request') # request is None here
        thumbnail = object.thumbnail.url
        return request.build_absolute_uri(thumbnail) # here is the url builder

在您看来,您可以将一些额外的上下文传递给您的序列化程序。这对处理您的请求很有用。

# views.py

def partial_update(self, request, pk=None):
    product= get_object_or_404(Product, pk=pk)

    serializer = ProductSerializer(product,
        data=request.data, partial=True,
        context={'request': request}, # you're missing this line
        )
    # ...

然后您可以使用 self.context.get('request') 操作您的序列化程序,但我看到您的代码中已经包含了这部分内容。

如果您想了解更多信息,here is the link to DRF documentation