首先道歉,如果它是一个糟糕的标题,我面临嵌套序列化程序的问题,但不太确定它的根本原因是什么。
以下是我的模特,
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
属性,显然管理器中没有序列化程序属性。所以我想知道我应该为这种情况做些什么?非常感谢帮助!
答案 0 :(得分:1)
您的associations
字段应为many = True
。因为您想要序列化多个associations
而不仅仅是一个。请记住,模型中的Service
个实例可能有一个或多个association
使他失望。
class ServiceSerializer(serializers.ModelSerializer):
associations = AssociationsSerializer(required=False, many=True)
class Meta:
model = Service