Python 如何在Django Rest框架的manytomanyfield中获取序列化程序中的键的值?
我在序列化期间显示数据时遇到问题 这是我的模型:Python 如何在Django Rest框架的manytomanyfield中获取序列化程序中的键的值?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我在序列化期间显示数据时遇到问题 这是我的模型: 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) pa
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')
一个解决方案:
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')
不需要将'languages=LanguageSerializer(many=True,read_only=True)`in LanguageSerializer'设置为比。正如self.name在语言模型中正确定义的那样。不需要在LanguageSerializer中使用`languages=LanguageSerializer(many=True,read_only=True)`in LanguageSerializer`。As self.name在语言模型中正确定义。解决方案不起作用。它只返回:[1、3、2]解决方案不起作用。它只返回:[1,3,2]