首页 > 解决方案 > 如何在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"
        }
    ]
}

我只想在语言数组上显示语言的名称,而不是语言数组的所有细节。什么是最好的解决方案?

标签: pythondjangodjango-rest-framework

解决方案


一种解决方案:

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

推荐阅读