【问题标题】:How to deserialize nested django object如何反序列化嵌套的 Django 对象
【发布时间】:2020-08-20 16:07:31
【问题描述】:

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

这是我的模型:

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'>。 我怎样才能从中得到标题,或者我做错了什么,我没有得到标题列表?

【问题讨论】:

  • 我在你的代码中没有看到album.instance.titles,我错过了什么吗?
  • 实例基本上是来自序列化器的字段之一,并且包含模型对象,在本例中是专辑类,因为专辑本身就是专辑序列化器对象。

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


【解决方案1】:

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

album.instance.titles.all()

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

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2015-08-26
    • 2021-11-30
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多