python - 如何在Django Rest Framework的manytomanyfield中获取序列化程序中的键值?
问题描述
我在序列化期间显示数据时遇到问题。
这是我的模型:
from django.db import models
class Paradigmn(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Language(models.Model):
name = models.CharField(max_length=50)
paradigm = models.ForeignKey(Paradigmn, on_delete=models.CASCADE)
def __str__(self):
return self.name
class Programmer(models.Model):
name = models.CharField(max_length=50)
languages = models.ManyToManyField(Language, related_name='languages')
def __str__(self):
return self.name
这是我的序列化程序:
from languages.models import Language, Paradigmn, Programmer
class LanguageSerializer(serializers.ModelSerializer):
paradigms = serializers.ReadOnlyField(source='paradigm.name')
class Meta:
model = Language
fields = ('id', 'name', 'paradigms')
class ParadigmnSerializer(serializers.ModelSerializer):
class Meta:
model = Paradigmn
fields = ('id', 'name',)
class ProgrammerSerializer(serializers.ModelSerializer):
languages = LanguageSerializer(many=True, read_only=True)
class Meta:
model = Programmer
fields = ('id', 'name', 'languages')
这是结果:
[
{
"id": 1,
"name": "Ryan",
"languages": [
{
"id": 1,
"name": "Java",
"paradigms": "Object-Oriented"
}
]
},
{
"id": 2,
"name": "Jean",
"languages": [
{
"id": 3,
"name": "Python",
"paradigms": "Object-Oriented"
}
]
},
{
"id": 3,
"name": "Michael",
"languages": [
{
"id": 2,
"name": "Elixir",
"paradigms": "Functional"
}
]
}
我只想在语言数组上显示语言的名称,而不是语言数组的所有细节。什么是最好的解决方案?
解决方案
一种解决方案:
from rest_framework.serializers import SerializerMethodField
class ProgrammerSerializer(serializers.ModelSerializer):
languagelist = SerializerMethodField()
def get_languagelist(self, obj):
return [{'name': i.name} for i in obj.languages.all()]
class Meta:
model = Programmer
fields = ('id', 'name', 'languagelist')
推荐阅读
- vue.js - snabdom、hyperscript 和 Vue 2 有什么关系?
- java - 我的“/” requestMapping 向我发送了 WhiteLabel“/”错误
- javascript - 在选择时显示选定的下拉项
- pandas - Spark 与 Scala 和 Pandas
- python - 我在这里想念什么?python中的简单for循环
- html - 如何从列表中创建新的 HtmlAgilityPack.HtmlDocument
从第一次“选择/过滤”运行? - python - 从一列 csv 文件创建数据集,其中数据用空格分隔
- ssh - 连接到 CentOS 7.9 时出现 SSH 错误权限被拒绝
- binary - 如果给出另一个字母的二进制代码,如何找到给定字母的 ascii 代码?
- c++ - 如何在 C 中循环 if 语句