python - 不要在 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')
推荐阅读
- c# - 将 WPF 与 IronPython 一起使用时如何创建“本地”命名空间?
- c# - 有人可以解释一下 ChangePasswordAsnyc 方法的工作原理吗?
- r - 在 map_map2_chr 函数中索引行号
- pandas - plotly中的散点图未显示所有数据点
- javascript - 如何添加一个形状的故事书旋钮,因此需要一个对象,然后是一个布尔值
- node.js - 当我将数据置于状态时无法获取 json 中的数组
- html - CSS样式在我的标签旁边创建一个悬停框,而不是在它上面
- javascript - Recharts dataMax 与 React Table 返回第一个值
- vb6 - 如何在VB6中使用复选框数组
- json - 通过逗号分隔符 Flutter 解析 JSON 字符串