Как получить значение ключа в сериализаторе во множестве полей в Django Rest Framework? - PullRequest
1 голос
/ 09 марта 2019

У меня проблема с отображением данных во время сериализации.

Это моя модель:

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"
        }
    ]
}

Я просто хочу показать в массиве языков имя языка вместо всех деталей языкового массива.Каково лучшее решение для этого?

1 Ответ

0 голосов
/ 09 марта 2019

Одно решение:

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') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...