如何反序列化嵌套的Django对象

时间:2020-08-20 16:07:31

标签: django django-models django-rest-framework django-serializer

我不太确定如何以一对多关系访问嵌套序列化器的数据。

这是我的模特:

class Album(models.Model):
    id = models.CharField(max_length=255, null=True, blank=True)
    name = models.CharField(max_length=255, null=True, blank=True)

class Title(models.Model):
    name = models.CharField(max_length=255, null=True, blank=True)
    album = models.ForeignKey(
        Album,
        related_name='titles'
    )

然后我有2个序列化器:

class AlbumSerializer(serializers.ModelSerializer):
    titles = TitleSerializer(many=True)

    class Meta:
        model = Album
        fields = ['id', 'name', 'titles']

    def create(self, validated_data):
        album = Album.objects.create(
            id=validated_data.get('id'),
            name=validated_data.get('name')
        )

        titles = validated_data.pop('titles')
        for title in titles:
            title['album'] = album
            _title = Title(**title)
            _title.save()
        return album


class TitleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Title
        fields = ['name']

要反序列化并保存,请运行以下命令:

album = AlbumSerializer(data=input_json)
album.is_valid()
album.save()

我的问题是现在无法访问这些物品。访问album.instance.titles的类型会让我<class 'django.db.models.fields.related_descriptors.create_reverse_many_to_one_manager.<locals>.RelatedManager'>。 如何获取其中的标题,或者我没有在其中找到标题列表,这是我做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要在all()上调用RelatedManager来执行数据库查询并获取结果

album.instance.titles.all()

RelatedManager就像普通的模型管理器(Model.objects)一样,该模型管理器检索按关系过滤的对象