不要在 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

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

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

相关内容

  • 没有找到相关文章

最新更新