You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:09:01