Django序列化问题:返回索引而非电影字段,如何关联序列化器?
解决Django序列化关联模型返回完整字段的问题
嘿,这个问题我熟!你已经写好两个序列化器了,只需要把它们嵌套关联起来就能实现需求,操作超简单:
你只需要修改MoviesCategoriesSerializer,把原来的movies字段替换成用MovieSerializer来序列化——因为movies是一个多对象的关联(一个分类对应多个电影),所以要加上many=True参数:
# 先确保MovieSerializer已经定义在前面 class MovieSerializer(serializers.ModelSerializer): class Meta: model = Movie fields = ('name', 'thumbnail', 'source_url', 'duration') class MoviesCategoriesSerializer(serializers.ModelSerializer): # 用MovieSerializer序列化关联的movies集合 movies = MovieSerializer(many=True) class Meta: model = MoviesCategories fields = ('name', 'movies')
修改后再执行MoviesCategoriesSerializer(MoviesCategories.objects.first()).data,返回的结果就会包含每个电影的完整字段,而不是仅主键ID了,示例结果大概是这样:
{ 'name': 'Animations', 'movies': [ { 'name': 'Toy Story', 'thumbnail': 'toystory_thumb.jpg', 'source_url': 'https://example.com/toystory', 'duration': '01:21:00' }, { 'name': 'Frozen', 'thumbnail': 'frozen_thumb.jpg', 'source_url': 'https://example.com/frozen', 'duration': '01:42:00' } ] }
原理很直白:Django REST Framework的嵌套序列化器会自动遍历关联的movies集合,用你指定的MovieSerializer逐个序列化每个电影对象,把完整的字段数据返回给你。
如果你的序列化器定义顺序有问题(比如MoviesCategoriesSerializer写在MovieSerializer前面),也可以用字符串引用的方式避免报错:
class MoviesCategoriesSerializer(serializers.ModelSerializer): movies = 'MovieSerializer'(many=True) class Meta: model = MoviesCategories fields = ('name', 'movies')
这样就完美解决你的需求啦!
内容的提问来源于stack exchange,提问作者E_K
相关产品推荐
相关产品推荐

