Serialization Django rest框架,序列化程序中的嵌套对象
我希望在序列化程序中有一个嵌套对象,而不仅仅是foreignkey(或url)。 如上所述,我只需在父序列化程序中指定嵌套对象的序列化程序类:Serialization Django rest框架,序列化程序中的嵌套对象,serialization,nested,django-rest-framework,Serialization,Nested,Django Rest Framework,我希望在序列化程序中有一个嵌套对象,而不仅仅是foreignkey(或url)。 如上所述,我只需在父序列化程序中指定嵌套对象的序列化程序类: #模型 类NestedSample(models.Model): something=models.CharField(最大长度=255) 类示例(models.Model): thing=models.BooleanField() 嵌套=models.ForeignKey(NestedSample) #序列化程序 类NestedSampleSerial
#模型
类NestedSample(models.Model):
something=models.CharField(最大长度=255)
类示例(models.Model):
thing=models.BooleanField()
嵌套=models.ForeignKey(NestedSample)
#序列化程序
类NestedSampleSerializer(serializers.HyperlinkedModelSerializer):
类元:
模型=api_models.NestedSample
类SampleSerializer(serializers.HyperlinkedModelSerializer):
nested=NestedSampleSerializer()#这里!
类元:
model=api_models.Sample
#观点
类NestedSampleViewSet(viewsets.ModelViewSet):
queryset=api_models.NestedSample.objects.all()
serializer_class=api_serializers.NestedSampleSerializer
类SampleViewSet(viewsets.ModelViewSet):
queryset=api_models.Sample.objects.all()
serializer_class=api_serializers.SampleSerializer
当我获取对象时,这非常有效,但无法再创建(=POST
)Sample
对象,我得到错误:
{u'non_field_errors': [u'Invalid data']}
我试图覆盖视图集中的create
方法,以使用pk获取对象:
class SampleViewSet(ViewSet.ModelViewSet):
queryset=api_models.Sample.objects.all()
serializer_class=api_serializers.SampleSerializer
def创建(自我,请求):
request.DATA['nested']=get_object_或_404(api_models.NestedSample,pk=request.DATA['nested'])
返回super(SampleViewSet,self)。创建(请求)
但它不起作用
有什么想法吗
我还发现我可以与解决问题的方法联系起来,但不要让我公开完整的嵌套对象,所以回到开始
谢谢,我可以想出两种解决这个问题的方法。我喜欢第一个 第一个解决方案: 使用django模型表单创建对象。重写创建和更新方法。示例创建方法:
def create(self, request):
form = SampleForm(data=request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
return Response(dict(id=instance.pk), status=status.HTTP_201_CREATED)
return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
通过这种方式,您可以创建具有任何类型验证的示例对象
第二种解决方案:
重写get_serializer_类方法并基于请求方法返回serializer类。定义两个序列化程序,一个用于post和put,另一个用于列表和检索。能否确认您正在发送一个JSON编码的请求,即请求的内容类型设置为JSON?
如果不是,帖子很可能是使用不支持嵌套的表单格式发送的。您不需要覆盖
create
来使用嵌套的示例实例填充请求数据,PK字符串应该可以自己工作。请参见以下回答:不,我只是使用基本格式发送值,我不知道它的名字:?thing=1&nested=2
,我发送了一个现有嵌套对象的pk
,我不想创建一个新对象。在我的测试中使用rest\u framework.test.APIClient为我解决了这个问题。()这是我第一次提到在测试时获得正确的编码-谢谢@XavierOrdoquy。。。将format='json'
添加到我的客户端。测试时的post
请求为我解决了这个问题。