在进行对象级验证时,如何从端点获取"pk"



我有一个端点为api/v1/controller/{pk}/device

现在,当我通过获取控制器对象的{pk}进行对象级验证时,我想向控制器对象添加一个设备:-

def validate(self, data):
data['device'] = self.(do something to get the PK present in the endpoint)
data.full_clean()
return data

在控制器资源下进行对象级验证以执行create操作时,有没有任何方法可以从端点获取pk/id

我假设序列化程序的名称为SomeSerializer。您可以像这样通过上下文传递id。

def post(self, request, *args, **kwargs):
SomeSerializer(data=request.data, context={"instance_id": kwargs.get('pk')})

并在validate方法中获取上下文,如

class SomeSerializer(serailizers.Serializer):
def validate(self, attrs):
validated_data = super(SomeSerializer, self).validate(attrs)
instance_id = self.context.get('instance_id')
# you can use the passed pk here
...

除了@shourav的答案之外,如果您对对象执行类似put/patch的更新操作,那么您可以在序列化程序的验证方法中使用self.instance。例如

from rest_framework.serializers import ModelSerializer

class MySerializer(ModelSerializer):        
def validate(self, attrs):
attrs = super().validate(attrs=attrs)
if self.instance:
pk_value = self.instance.id
...
return attrs

来自文件;

将初始对象或查询集传递给序列化程序实例时,该对象将作为.instance可用。如果未传递初始对象,则.instance属性将为None。

我从这里得到了答案:-将额外的参数传递给Django Rest Framework 中的Serializer类

这就是我所做的:-

class SomeView(ListCreateAPIView):
...
...
...
def get_serializer_context(self):
context = super().get_serializer_context()
context['device_id'] = self.kwargs['pk']
return context
class SomeSerialzier(serializers.ModeSerializer):
...
...
...
def validate(self, data):
data['device'] = self.context['device_id']
data.full_clean()
return data

最新更新