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
属性,显然在管理器中没有序列化器属性。所以我想知道在这种情况下我应该怎么做?非常感谢你的帮助 您的关联
字段应为hasmany=True
。因为您想序列化多个关联
,而不仅仅是一个关联。请记住,模型中的服务
实例可能有一个或多个关联
指向他
class ServiceSerializer(serializers.ModelSerializer):
associations = AssociationsSerializer(required=False, many=True)
class Meta:
model = Service
谢谢,我试试看。但是如果一个服务只能有一个关联呢。我应该改用OneTONE吗?@Derek是的。使用OneToOnethanks进行确认。然而,我认为我的一般问题是,对于一个包含RelatedManager字段的序列化程序,如何从一个还没有相关对象的对象初始化序列化程序?