gpt4 book ai didi

Django 序列化程序多对多返回名称数组而不是 ID 数组

转载 作者:行者123 更新时间:2023-12-05 01:36:07 25 4
gpt4 key购买 nike

我的模型:

class Category(models.Model):
name = models.Charfield()..
code = models.Charfield()...

class Movie(models.Model):
name = models.Charfield()..
categories = models.ManyToManyField(Category)

我的序列化器

class MovieSerializer(serializers.ModelSerialier):
class Meta:
model= Movie
fields = ['name',
'categories',
]

当我通过 id 获取电影时,它返回:

[{"name": "我的电影",“类别”:[1、2、3],}]

我希望我的回应是:....“类别”:[“乐趣”,“冒险”,...]

我尝试过的

class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name']

def to_representation(self, instance):
return instance.name

它给了我预期的结果,但我认为这不是一种干净的方法

最佳答案

选项 1

您可以为此使用您的模型 __str__ 方法。只需使用 StringRelatedField:

class MovieSerializer(serializers.ModelSerialier):
categories = serializers.StringRelatedField(many=True)
class Meta:
model= Movie
fields = ['name', 'categories']

并将 __str__ 方法添加到您的类别模型中:

class Category(models.Model):
name = models.Charfield()
code = models.Charfield()

def __str__(self):
return self.name

选项 2

使用自定义 RelatedField,如 docs 中所述:

class CategoryListingField(serializers.RelatedField):
def to_representation(self, value):
return value.name

class MovieSerializer(serializers.ModelSerialier):
categories = CategoryListingField(many=True)
class Meta:
model= Movie
fields = ['name', 'categories']

这与您所做的很接近,只是更简洁了一点,因为 RelatedField 就是为实现这一目标而设计的。使用自定义序列化器不是解决此问题的方法,因为您不想序列化对象本身,而只想序列化它的特定字段。默认情况下,这是 pk(或 id),但通过指定您自己的相关字段,您可以将其更改为您想要的任何内容。

关于Django 序列化程序多对多返回名称数组而不是 ID 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62302668/

25 4 0
文章推荐: azure-devops - 根据标签从分支下载最新的管道工件
文章推荐: javascript - Filepond 自定义放置区
文章推荐: 来自 appsettings 的 C# 强类型 ConfigurationBuilder List