DRF嵌套序列化程序支持空字段

时间:2015-03-06 02:49:28

标签: django serialization django-rest-framework

首先道歉,如果它是一个糟糕的标题,我面临嵌套序列化程序的问题,但不太确定它的根本原因是什么。

以下是我的模特,

from django.db import models
from django.db.models.fields import CharField

class AssociatedService(models.Model):
    id = models.CharField(max_length=100, primary_key=True)
    name = models.CharField(max_length=50)
    association = models.ForeignKey('Association', null=True, related_name='associated_service')


class Association(models.Model):
    id = models.CharField(max_length=200, primary_key=True)
    uri = models.URLField()
    service = models.ForeignKey('Service', null=True, related_name='associations')    

class Service(models.Model):
    id = models.CharField(max_length=100, primary_key=True)
    uri = models.URLField();

串行器,

from rest_framework import serializers
from bi_pod.models import Service, AssociatedService, Association


class AssociatedServiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = AssociatedService

class AssociationsSerializer(serializers.ModelSerializer):
    associated_service = AssociatedServiceSerializer(many=False)
    class Meta:
        model = Association

    def create(self, validated_data):      
        associated_service_data = validated_data.pop('associated_service')
        associated_service = AssociatedServiceSerializer(data=associated_service_data, partial=True)
        if associated_service.is_valid():
            associated_service_obj = associated_service.save()
            assoication = Association.objects.create(**validated_data)
            assoication.associated_service.add(associated_service_obj)     
            return assoication


class ServiceSerializer(serializers.ModelSerializer):
    associations = AssociationsSerializer(required=False, many=False)    
    class Meta:
        model = Service

行为是首先没有关联的POST服务。一旦服务在db中,我就会发布关联并将其添加到相应的服务中。

问题是,如果我的序列化程序中有associations = AssociationsSerializer(required=False, many=False),那么以下代码将失败,

service_serializer = ServiceSerializer(data=request.data, partial=True)
if service_serializer.is_valid():
    service_serializer.save()
response_data = service_serializer.data

特别是在致电service_serializer.data时,会发现异常Got AttributeError when attempting to get a value for field id on serializer AssociationsSerializer. The serializer field might be named incorrectly and not match any attribute or key on the RelatedManager instance. Original exception text was: 'RelatedManager' object has no attribute 'id'.

我追溯到DRF代码,发现它会尝试从id获取RelatedManager属性,显然管理器中没有序列化程序属性。所以我想知道我应该为这种情况做些什么?非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

您的associations字段应为many = True。因为您想要序列化多个associations而不仅仅是一个。请记住,模型中的Service个实例可能有一个或多个association使他失望。

class ServiceSerializer(serializers.ModelSerializer):
    associations = AssociationsSerializer(required=False, many=True)    
    class Meta:
        model = Service