Django REST Framework嵌套序列化产品关联配料报错如何解决
问题原因
你遇到的报错核心是IngredientProductRelationSerializer的书写格式错误:DRF 规定模型序列化器的model、fields等配置项必须放在名为Meta的内部子类中,你当前直接把这两个配置作为序列化器的直接类属性,DRF 无法识别序列化规则,处理关联集合时就抛出了'list' object has no attribute 'values'的错误。
解决方法
1. 修正序列化器配置
调整serializers.py的代码,给IngredientProductRelationSerializer补全Meta内部类,同时取消注释关联字段的序列化配置:
class IngredientProductRelationSerializer(serializers.ModelSerializer): # 配置项必须放在Meta子类中 class Meta: model = IngredientProductRelation fields = ['ingredient', 'quantity'] class ProductSerializer(serializers.ModelSerializer): # 取消该行注释 ingredients = IngredientProductRelationSerializer(read_only=True, many=True) class Meta: model = Product fields = ['id', 'name', 'classification', 'ingredients']
2. 可选性能优化
为了避免接口查询时产生N+1性能问题,调整views.py的查询集,预加载关联的配料数据:
class IngredientViewsets(viewsets.ReadOnlyModelViewSet): # 预取关联的ingredients字段,减少数据库查询次数 queryset = Product.objects.all().prefetch_related('ingredients') serializer_class = ProductSerializer
修改完成后重启服务,接口返回的ingredients字段就会是你预期的包含ingredient(配料ID)和quantity(用量)的嵌套结构。
内容的提问来源于stack exchange,提问作者Fabio Zorzetto
相关产品推荐
相关产品推荐

