Python Don';t在DRF序列化中使用字段名(只有一个字段)

Python Don';t在DRF序列化中使用字段名(只有一个字段),python,django,django-rest-framework,django-serializer,manytomanyfield,Python,Django,Django Rest Framework,Django Serializer,Manytomanyfield,我希望嵌套模型的序列化不包括每个实例的字段名,因为序列化中只有一个字段 我在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_leng

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

我在
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
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']
class CreatePersonView(generics.CreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer
class LanguageRelatedField(serializers.StringRelatedField):
    def get_queryset(self):
        return Language.objects.all()

    def to_representation(self, instance):
        return instance.code

    def to_internal_value(self, data):
        try:
            return Language.objects.get(code=data)
        except Language.DoesNotExist:
            raise serializers.ValidationError('Language {} could not be recognized'.format(data))


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

    class Meta:
        model = Person
        fields = ['name', 'languages']
语言是一个
ManyToManyField
,因为一个人可以说多种语言,一种语言可以被许多人说

我在
serializers.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
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']
class CreatePersonView(generics.CreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer
class LanguageRelatedField(serializers.StringRelatedField):
    def get_queryset(self):
        return Language.objects.all()

    def to_representation(self, instance):
        return instance.code

    def to_internal_value(self, data):
        try:
            return Language.objects.get(code=data)
        except Language.DoesNotExist:
            raise serializers.ValidationError('Language {} could not be recognized'.format(data))


class PersonSerializer(serializers.ModelSerializer):
    languages = LanguageRelatedField(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"]}
但我希望它看起来像这样:

{"name": "Elizabeth II", "languages": [{"code":"en"}, {"code":"fr"}]}
{"name": "Elizabeth II", "languages": ["en", "fr"]}
这应该不会引起问题,因为在语言的序列化中只有一个字段,并且永远不会有另一个字段,所以
“code”
字段名是多余的

如何做到这一点

更新:从JSON over DRF创建新人时,如何使这一点也起作用

我在
views.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
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']
class CreatePersonView(generics.CreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer
class LanguageRelatedField(serializers.StringRelatedField):
    def get_queryset(self):
        return Language.objects.all()

    def to_representation(self, instance):
        return instance.code

    def to_internal_value(self, data):
        try:
            return Language.objects.get(code=data)
        except Language.DoesNotExist:
            raise serializers.ValidationError('Language {} could not be recognized'.format(data))


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

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

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

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')

这就是我如何实现想要的行为:

serializers.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
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']
class CreatePersonView(generics.CreateAPIView):
    queryset = Person.objects.all()
    serializer_class = PersonSerializer
class LanguageRelatedField(serializers.StringRelatedField):
    def get_queryset(self):
        return Language.objects.all()

    def to_representation(self, instance):
        return instance.code

    def to_internal_value(self, data):
        try:
            return Language.objects.get(code=data)
        except Language.DoesNotExist:
            raise serializers.ValidationError('Language {} could not be recognized'.format(data))


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

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

请考虑包括[ Python ]和[ django ]标签很好的答案,谢谢!你知道如何通过DRF从JSON创建一个新的人物吗?很抱歉,我没有正确理解你的问题@talzI希望能够使用相同的格式,通过DRF对象创建视图创建一个新的
person
对象,就像问题的更新一样。另外,我建议将
flat=True
添加到
values\u列表
调用中,