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

Django DRF嵌套序列化程序支持空字段,django,serialization,django-rest-framework,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.CharFiel

首先,如果标题不好,请道歉,我面临嵌套序列化程序的问题,但不太确定其根本原因是什么

这是我的模型

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
这种行为是先在没有关联的情况下邮寄服务。一旦服务进入数据库,我将发布关联并将其添加到相应的服务中

问题是如果我的序列化程序中有
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\u serializer.data
时,当尝试获取serializer AssociationsSerializer上的字段id值时,会出现异常
get AttributeError。
序列化程序字段的名称可能不正确,并且与RelatedManager实例上的任何属性或键都不匹配。
原始异常文本为:“RelatedManager”对象没有属性“id”。


我跟踪了DRF代码,发现它将尝试从
RelatedManager
获取
id
属性,显然在管理器中没有序列化器属性。所以我想知道在这种情况下我应该怎么做?非常感谢你的帮助

您的
关联
字段应为has
many=True
。因为您想序列化多个
关联
,而不仅仅是一个关联。请记住,模型中的
服务
实例可能有一个或多个
关联
指向他

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

谢谢,我试试看。但是如果一个服务只能有一个关联呢。我应该改用OneTONE吗?@Derek是的。使用OneToOnethanks进行确认。然而,我认为我的一般问题是,对于一个包含RelatedManager字段的序列化程序,如何从一个还没有相关对象的对象初始化序列化程序?