【问题标题】:DRF nested serializer supports empty fieldDRF 嵌套序列化程序支持空字段
【发布时间】:2015-03-06 02:49:28
【问题描述】:

如果标题不好,首先道歉,我遇到了嵌套序列化程序的问题,但不太确定它的根本原因是什么。

这是我的模型,

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_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 代码,发现它会尝试从 RelatedManager 获取 id 属性,显然管理器内部没有序列化程序属性。所以我想知道在这种情况下我该怎么办?非常感谢帮助!

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我会试试的。但是,如果一项服务只能有一个关联呢?我应该改用 OneToOne 吗?
    • @Derek 是的。使用 OneToOne
    • 感谢您的确认。但是我认为我遇到的一般问题是,对于其中包含 RelatedManager 字段的序列化程序,如何从还没有相关对象的对象初始化序列化程序?
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2019-12-13
    相关资源
    最近更新 更多