Django Rest Api - ManyToManyField, отображать «title» вместо «id» в массиве упражнений - PullRequest
1 голос
/ 27 мая 2019

Django Rest Api - ManyToManyField, отображать «title» вместо «id» в массиве упражнений

HTTP 200 OK
Allow: GET, POST, PUT, DELETE, PATCH
Content-Type: application/json
Vary: Accept

[
{
    "id": 1,
    "title": "Push Workout Bjarred",
    "description": "Kör Hårt!",
    "exercises": [
        3,
        4,
        5,
        6,
        9,
        10
    ],
    "cardio": [
        4
    ]
},
{
    "id": 2,
    "title": "Pull Workout Loddekopinge",
    "description": "",
    "exercises": [
        1,
        2,
        7,
        8
    ],
    "cardio": []
},
{
    "id": 3,
    "title": "CardioPass",
    "description": "",
    "exercises": [],
    "cardio": [
        2,
        3,
        4
    ]
}
]

Сериализатор (поэтому я хочу отображать заголовок, а не идентификатор для каждого упражнения)

class WorkoutSerializer(serializers.ModelSerializer):
class Meta:
    model = Workout
    fields = ('id', 'title', 'description', 'exercises', 'cardio')

Вот модели, обратите внимание, что я хочу отображать имя упражнения для каждого упражнения в массиве API, мне не нужен идентификатор! - Это прошло прямо сейчас! :)

class Bodypart(models.Model):
name = models.CharField(max_length=100)

def __str__(self):
    return self.name

class Exercise(models.Model):
name = models.CharField(max_length=40)
bodyparts = models.ManyToManyField(Bodypart, blank=True)

def __str__(self):
    return self.name

class Cardio(models.Model):
name = models.CharField(max_length=40)
time = models.IntegerField(default=10)

def __str__(self):
    return self.name

class Meta:
    verbose_name_plural = 'cardio'

class Workout(models.Model):
title = models.CharField(max_length=120)
description = models.CharField(max_length=1000, blank=True)
exercises = models.ManyToManyField(Exercise, blank=True)
cardio = models.ManyToManyField(Cardio, blank=True)

def __str__(self):
    return self.title

Ответы [ 3 ]

2 голосов
/ 27 мая 2019

Создание сериализатора для модели Exercise с полем имени:

class ExerciseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Exercise
        fields = ('name', )

И добавьте его в сериализатор Workout:

class WorkoutSerializer(serializers.ModelSerializer):
    exercises = ExerciseSerializer(many=True, read_only=True)
    class Meta:
        fields = ('id', 'title', 'description', 'exercises', 'cardio', )
1 голос
/ 27 мая 2019

Вы можете получить это, изменив свой WorkoutSerializer как этот

class WorkoutSerializer(serializers.ModelSerializer):
    exercises = serializers.StringRelatedField(many=True, read_only=True)
    class Meta:
        fields = ('id', 'title', 'description', 'exercises', 'cardio', )

Вы получите результат JSON, как это

[
{
    "id": 1,
    "title": "Push Workout Bjarred",
    "description": "Kör Hårt!",
    "exercises": [
        "Exercise 1",
        "Exercise 2",
        "Exercise 4",
        "Exercise 3"
    ],
    "cardio": [
        4
    ]
},
...

Подробнее о сериализаторах отдыха django см. https://www.django -rest-framework.org / api-guide / relations /

0 голосов
/ 28 мая 2019

Попробуйте добавить поле упражнений в сериализаторе, как показано ниже exercises = serializers.SlugRelatedField(read_only=True, slug_field='title')

...