DRF 使用带有动态主键的序列化器
DRF using serializers with a dynamic primary key
我们的 API 定义了一个模型:
class Job(models.Model):
file = models.FileField('File')
xml = models.FileField('XML')
有一个基本的序列化器:
class XmlSerializer(serializers.ModelSerializer)
file = serializers.FileField(read_only=True)
xml = serializers.FileField(required=True)
class Meta:
model = Job
fields = '__all__'
我们不想更改 file
,但我们确实想更改 xml
字段。 xml 是由不知道主键的系统上传的。当然我们需要这个来更新模型。
我现在有以下代码:
class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = XmlSerializer
def post(self, request, format=None):
pk = 200
serializer = XmlSerializer(request.data)
return Response({})
pk = 200
用作示例,而不是我们用来解析 xml 的代码。我知道这行不通,但这是为了表明我的意图(或多或少)。
我试过用
id = serializers.SerializerMethodField()
def get_id(self, obj):
return 200
没有成功。
如何将此主键放入序列化程序中?
我让它变得太难了。解决方案非常简单。
class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = XmlSerializer
def post(self, request, format=None):
id = magic_xml_parser_function()
job = get_object_or_404(Job, pk=id)
serializer = XmlSerializer(job, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
magic_xml_parser_function()
包含我们在 xml 中找到的 ID。这为我们解决了。
我们的 API 定义了一个模型:
class Job(models.Model):
file = models.FileField('File')
xml = models.FileField('XML')
有一个基本的序列化器:
class XmlSerializer(serializers.ModelSerializer)
file = serializers.FileField(read_only=True)
xml = serializers.FileField(required=True)
class Meta:
model = Job
fields = '__all__'
我们不想更改 file
,但我们确实想更改 xml
字段。 xml 是由不知道主键的系统上传的。当然我们需要这个来更新模型。
我现在有以下代码:
class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = XmlSerializer
def post(self, request, format=None):
pk = 200
serializer = XmlSerializer(request.data)
return Response({})
pk = 200
用作示例,而不是我们用来解析 xml 的代码。我知道这行不通,但这是为了表明我的意图(或多或少)。
我试过用
id = serializers.SerializerMethodField()
def get_id(self, obj):
return 200
没有成功。
如何将此主键放入序列化程序中?
我让它变得太难了。解决方案非常简单。
class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
serializer_class = XmlSerializer
def post(self, request, format=None):
id = magic_xml_parser_function()
job = get_object_or_404(Job, pk=id)
serializer = XmlSerializer(job, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
magic_xml_parser_function()
包含我们在 xml 中找到的 ID。这为我们解决了。