Django Rest Framework自定义字段只有一对值(没有fieldname作为dict键)

ePa*_*oal 1 python django django-serializer django-rest-framework

嗨,我想只提供一对没有REST服务键的值:

看看我的serializers.py:

 class TranslationSerializer(serializers.ModelSerializer):
        translated_term = serializers.CharField(read_only=True)

        class Meta:
                model = Translation
                fields = ('language','translated_term')

class VocabSerializer(serializers.ModelSerializer):
       ...
        translates = TranslationSerializer(many=True, read_only=True)
       ...

        class Meta:
        model = Vocab
        fields = ( ..., 'translates',...)
Run Code Online (Sandbox Code Playgroud)

结果如下:

"translates": [
        {
            "language": "EN",
            "translated_term": "Chair"
        }
        {
            "language": "IT",
            "translated_term": "asd"
        }
    ],
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,此结果将该字段的名称显示为该字段值旁边的dict键.但我希望有一个不同的结构.如下:

    "translates": [
        {
            "EN": "Chair", "IT":"asd"
        }
    ],
Run Code Online (Sandbox Code Playgroud)

此示例显示了一对键/值,其中key是语言字段值,dict的值是已翻译字段的值.

如何只显示"语言"字段的值与"已翻译"字段而没有字段名称?

Mic*_*oni 7

您可以通过自定义列表序列化程序来实现它:

class TranslationListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        r = super().to_representation(data)

        return { item['language']: item['translated_term'] for item in r }

class TranslationSerializer(serializers.ModelSerializer):
    translated_term = serializers.CharField(read_only=True)

    class Meta:
            model = Translation
            fields = ('language','translated_term')
            list_serializer_class = TranslationListSerializer
Run Code Online (Sandbox Code Playgroud)