系列化

我想在一个序列化器中有一个嵌套的对象,而不仅仅是foreignkey(或url)。 正如这篇文档所说的,我只需要在父级序列化器中指定嵌套对象的序列化器类:

# Models

class NestedSample(models.Model):
    something = models.CharField(max_length=255)

class Sample(models.Model):
    thing = models.BooleanField()
    nested = models.ForeignKey(NestedSample)

# Serializers

class NestedSampleSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = api_models.NestedSample

class SampleSerializer(serializers.HyperlinkedModelSerializer):
    nested = NestedSampleSerializer() # HERE!

    class Meta:
        model = api_models.Sample

# Views

class NestedSampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.NestedSample.objects.all()
    serializer_class = api_serializers.NestedSampleSerializer

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer

当我得到这些对象时,这很好,但不可能再创建(= POSTSample对象,我得到这个错误:

{u'non_field_errors': [u'Invalid data']}

我试图覆盖视图中的create方法以使用pk获取对象:

class SampleViewSet(viewsets.ModelViewSet):
    queryset = api_models.Sample.objects.all()
    serializer_class = api_serializers.SampleSerializer

    def create(self, request):
        request.DATA['nested'] = get_object_or_404(api_models.NestedSample, pk=request.DATA['nested'])
        return super(SampleViewSet, self).create(request)

但它不起作用。

任何想法?

我也发现了这个问题,我可以解决这个问题,但不要让我公开完整的嵌套对象,所以回到开头。

谢谢,


我可以想出解决这个问题的两个办法。 我更喜欢第一个。

第一解

使用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)

这样你可以用你喜欢的任何验证方式创建Sample对象。

第二种方案

重写get_serializer_class方法并根据请求方法返回序列化程序类。 为post和put定义两个序列化器,一个用于列表和检索。


你能否确认你正在发送一个JSON编码的请求 - 即请求的内容类型设置为JSON? 如果没有,该帖子很可能使用不支持嵌套的表单格式发送。

链接地址: http://www.djcxy.com/p/79115.html

上一篇: serialization

下一篇: Converting hdf5 to csv or tsv files