如何重写Django-oscar-api的/api/products/接口返回更多自定义字段
解决方法
1. 核心原因
你自定义的序列化器没有覆盖oscar-api的默认配置,框架依然调用内置的ProductLinkSerializer处理接口响应,所以修改没有生效。
2. 补全序列化器逻辑
你需要先把待添加的字段都补充到自定义序列化器中,其中attributes需要额外处理取值逻辑:
from rest_framework import serializers from oscarapi.serializers.product import ( ProductImageSerializer, ProductLinkSerializer ) class MyProductLinkSerializer(ProductLinkSerializer): images = ProductImageSerializer(many=True, required=False) # 补充缺失的字段 description = serializers.CharField(read_only=True) attributes = serializers.SerializerMethodField(read_only=True) class Meta(ProductLinkSerializer.Meta): # 把所有需要返回的字段都加进来 fields = ProductLinkSerializer.Meta.fields + ( 'description', 'meta_title', 'meta_description', 'rating', 'attributes' ) def get_attributes(self, obj): # 格式化返回产品的所有属性值,可按需调整返回结构 return [ { "code": attr.attribute.code, "name": attr.attribute.name, "value": attr.value } for attr in obj.attribute_values.select_related("attribute").all() ]
3. 配置覆盖默认序列化器
在项目的settings.py中添加如下配置,指定oscar-api使用你自定义的序列化器:
# 替换商品列表接口使用的序列化器,路径替换为你自己的序列化器存放路径 OSCARAPI_PRODUCT_LINK_SERIALIZER = "你的应用名.serializers.MyProductLinkSerializer" # 如果需要同时修改商品详情接口的返回字段,额外添加以下配置即可 # OSCARAPI_PRODUCT_SERIALIZER = "你的应用名.serializers.MyProductSerializer"
注意:配置中的路径要和你存放自定义序列化器的文件路径完全一致,比如序列化器放在
apps/catalog/serializers.py里,路径就写apps.catalog.serializers.MyProductLinkSerializer。
4. 常见校验点
- 确认你已经启用了oscar的
reviews应用,否则rating字段会返回空值 - 如果你需要返回多语种字段,需要额外配置对应字段的多语言取值逻辑
- 修改配置后需要重启Django服务才能生效
内容的提问来源于stack exchange,提问作者OneSapien
相关产品推荐
相关产品推荐

