我希望在序列化器中有一个嵌套的对象,而不仅仅是外键(或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
方法以通过主键获取对象:
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)
但它并不起作用。
有什么想法吗?
我还发现了这个问题,我可以与之联系,当然解决了问题,但不允许我暴露完整的嵌套对象,所以回到开始。
谢谢。
create
方法来使用 NestedSample 实例来填充请求数据,PK 字符串本身就可以工作。 - Fiver