Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django Rest框架的manytomanyfield中获取序列化程序中的键的值?_Python_Django_Django Rest Framework - Fatal编程技术网

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]