系列化
我想在一个序列化器中有一个嵌套的对象,而不仅仅是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
当我得到这些对象时,这很好,但不可能再创建(= POST
) Sample
对象,我得到这个错误:
{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