Django 序列化器 ManyToMany 重新运行名称数组而不是 ID 数组



我的模型:

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 获取电影时,它会返回:

[ {"名称": "我的电影", "类别": [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,如文档中所述:

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(,但通过指定您自己的相关字段,您可以将其更改为所需的任何字段。

depth = 1添加到序列化程序。

这将为您提供类似以下内容:

[
{
"name": "My Movie",
"categories": [
{ "id": 1, "name": "Fun", "code": "category_code" }
]
}
]

然后,您可以从此对象中提取所需的任何内容。

最新更新