我的模型:
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" }
]
}
]
然后,您可以从此对象中提取所需的任何内容。