首页 > 解决方案 > 不要在 DRF 序列化中使用字段名(只有一个字段)

问题描述

我希望嵌套模型的序列化不包括每个实例的字段名称,因为序列化中只有一个字段。

我有以下型号models.py

class Language(models.Model):
    name = models.CharField(max_length=32)
    code = models.CharField(max_length=32, unique=True)


class Person(models.Model):
    name = models.CharField(max_lenght=128)
    languages = models.ManyToManyField(Language, blank=True) # the languages this person speaks

语言是一种ManyToManyField,因为一个人可以说多种语言,而一种语言可以被很多人说。

我为他们准备了以下序列化程序serializers.py

class LanguageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Language
        fields = ['code']


class PersonSerializer(serializers.ModelSerializer):
    languages = LanguageSerializer(many=True, required=False)


    class Meta:
        model = Person
        fields = ['name', 'languages']

目前,序列化为 JSON 看起来像这样:

{"name": "Elizabeth II", "languages": [{"code":"en"}, {"code":"fr"}]}

但我希望它看起来像这样:

{"name": "Elizabeth II", "languages": ["en", "fr"]}

而且这应该不会造成问题,因为语言的序列化中只有一个字段,永远不会有另一个字段,所以"code"字段名是多余的。

如何做到这一点?

更新:当通过 DRF 从 JSON 创建一个新人时,如何使这也起作用?

我有以下观点views.py

class CreatePersonView(generics.CreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer

标签: pythondjangodjango-rest-frameworkdjango-serializermanytomanyfield

解决方案


您可以像这样更改序列化程序。

class PersonSerializer(serializers.ModelSerializer):
    languages = serializers.SerializerMethodField()

    class Meta:
        model = Person
        fields = ['name', 'languages']

     def get_languages(self, obj):
        return obj.languages.all().values_list('name')

推荐阅读