简体   繁体   English

将嵌套模型序列化为Django中的键控JSON对象

[英]Serialize nested models as a keyed JSON object in Django

I have a Django model that has many=True nesting, and I'd like to serializer the nested objects (in Django Rest Framework) as an object instead of a list (which is the default in DRF). 我有一个具有很多= True嵌套的Django模型,并且我想将嵌套对象(在Django Rest Framework中)序列化为一个对象而不是一个列表(这是DRF中的默认值)。

Adding many=True serializes things as a list. 添加many = True会将事物序列化为列表。

class PostSerializer(serializers.ModelSerializer):
  votes = VoteSerializer(many=True)

Instead of rendering the votes as a list of objects: 而不是将投票呈现为对象列表:

[... posts: [{id: 123, user: A}, {id: 456, user: B}, ....]

I'd like to render votes as a list of objects keyed by id: 我想将投票作为由id键控的对象列表:

[... posts: {123: {user: A}, 456: {user: B}}, ...]

This is poking into a private API and isn't exactly concise, but should work. 这是一个私有API,虽然不够简洁,但应该可以。

class DictManyRelatedField(serializers.ManyRelatedField):
    def to_representation(self, iterable):
        return {
           value.pk: self.child_relation.to_representation(value)
           for value in iterable
        }


class VoteSerializer(serializers.ModelSerializer):
    user = serializers.CharField()

    class Meta:
        model = Vote
        fields = ('user',)

    @classmethod
    def many_init(cls, *args, **kwargs):
        kwargs['child_relation'] = cls()
        return DictManyRelatedField(*args, **kwargs)


class PostSerializer(serializers.ModelSerializer):
    votes = VoteSerializer(read_only=True, many=True)

    class Meta:
        model = Post
        fields = ('votes',)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM