Django Rest Api - ManyToManyField,在练习数组中显示“标题"而不是“id" [英] Django Rest Api - ManyToManyField, Display 'title' instead of 'id' in the Exercises Array

查看:28
本文介绍了Django Rest Api - ManyToManyField,在练习数组中显示“标题"而不是“id"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Django Rest Api - ManyToManyField,在练习数组中显示title"而不是id"

HTTP 200 OK允许:获取、发布、放置、删除、补丁内容类型:应用程序/json变化:接受[{身份证":1,"title": "推动锻炼 Bjarred","description": "Kör Hårt!",练习":[3、4、5、6、9、10],有氧运动": [4]},{身份证":2,"title": "拉力训练 Loddekopinge",描述": "",练习":[1、2、7、8],有氧运动": []},{身份证":3,"title": "CardioPass",描述": "",练习":[],有氧运动": [2、3、4]}]

Serializer(所以我想显示标题而不是每个练习的id)

class WorkoutSerializer(serializers.ModelSerializer):元类:模型 = 锻炼fields = ('id', 'title', 'description', 'exercises', 'cardio')

这里是模型,注意我想在api数组中显示每个练习的练习名称,我不要id!- 马上就过去了!:)

class Bodypart(models.Model):name = models.CharField(max_length=100)def __str__(self):返回 self.name类练习(模型.模型):name = models.CharField(max_length=40)bodyparts = models.ManyToManyField(Bodypart, blank=True)def __str__(self):返回 self.name类有氧(模型.模型):name = models.CharField(max_length=40)时间 = 模型.IntegerField(默认 = 10)def __str__(self):返回 self.name元类:verbose_name_plural = 'cardio'类锻炼(模型.模型):标题=models.CharField(max_length=120)description = models.CharField(max_length=1000, blank=True)练习=models.ManyToManyField(练习,空白=真)心=models.ManyToManyField(心,空白=真)def __str__(self):返回 self.title

解决方案

你可以通过像这样改变你的 WorkoutSerializer 来获得这个

class WorkoutSerializer(serializers.ModelSerializer):练习 = serializers.StringRelatedField(many=True, read_only=True)元类:字段 = ('id', 'title', 'description', 'exercises', 'cardio', )

你会得到这样的结果json

<预><代码>[{身份证":1,"title": "推动锻炼 Bjarred","description": "Kör Hårt!",练习":[练习1",练习2",练习4",练习3"],有氧运动": [4]},...

有关 django rest 序列化程序的更多信息,请参见 https://www.django-rest-framework.org/api-guide/relations/

Django Rest Api - ManyToManyField, Display 'title' instead of 'id' in the Exercises Array

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

Serializer (So I want to display the title and not the id for every exercise)

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

Here are the models, note that I want to display the exercise name for every exercise in the api array, I don't want the id! - That is passed right now! :)

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

解决方案

You can get this by changing your WorkoutSerializer like this

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

You will get the result json like this

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

More about django rest serializers see https://www.django-rest-framework.org/api-guide/relations/

这篇关于Django Rest Api - ManyToManyField,在练习数组中显示“标题"而不是“id"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆