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

2024-05-23 19:13:35 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我只想在REST服务上提供一对没有密钥的值:

看看我的序列化程序.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',...)

结果如下:

^{pr2}$

如您所见,这个结果将字段的名称显示为dict key,紧靠该字段的值。 但我想有一个不同的结构。如下所示:

    "translates": [
        {
            "EN": "Chair", "IT":"asd"
        }
    ],

这个例子显示了一对key/value,其中key是语言字段值,dict值是翻译字段的值。在

如何仅显示“language”字段与“translated”字段的值对而不显示字段名称?


Tags: keytrueonlyfieldsreadmodellanguagemeta
2条回答

您可以通过自定义list serializer来实现它:

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

通过使用为序列化程序创建自定义的to_representation函数,可以控制字典表示。在

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

        def to_representation(self, instance):
            # get the instance -> Dict of primitive data types
            representation = super(TranslationSerializer, self).to_representation(instance)

            # manipulate returned dictionary as desired
            language = representation.pop('language')
            translated_term = representation.pop('translated_term')

            # repackage
            repackaged = {language: translated_term}

            return repackaged

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

这将生成格式为

^{pr2}$

然而,这并不是您所希望的那样,也许VocabSerializer的自定义“to-u表示”可以实现这一点。在

相关问题 更多 >