Serialization Django rest框架,序列化程序中的嵌套对象

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

我希望在序列化程序中有一个嵌套对象,而不仅仅是foreignkey(或url)。 如上所述,我只需在父序列化程序中指定嵌套对象的序列化程序类:

#模型
类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
请求为我解决了这个问题。