在 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。
我正在进行一项测试,部分更新或修补我的产品模型中的某些字段。我应该能够更新我的产品模型中的任何字段。在我的序列化程序中,我有一个来自请求对象的 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。