Django Oscar中如何将所有商品的可购买状态统一设为true
Django Oscar 全局关闭商品可用性校验实现方案
两种思路都能实现接口返回is_available_to_buy: true的效果,但影响范围、稳定性差异很大,优先选第一种改策略层的方案,第二种只改序列化器的方案有逻辑断层风险,不推荐。
方案1:重写策略层Structured类(推荐)
这个方案是从Oscar校验逻辑的根源修改,全链路(接口返回、加购、结算、后台校验)都会统一返回可购买状态,符合Oscar官方的扩展规范,不会出现前后端逻辑不一致的问题。
不要直接修改Oscar安装包内的源码,按照Oscar的fork app规则操作:
- 第一步:在项目中fork Oscar原生的partner应用,命令行执行:
执行完成后,把生成的partner app路径加到项目python manage.py oscar_fork_app partner 自定义存放重写app的目录路径settings.py的INSTALLED_APPS列表最前面,保证自定义app优先于Oscar原生app加载。 - 第二步:在fork出来的partner app目录下新建
strategy.py,重写Structured类的商品信息获取逻辑,强制覆盖可用性状态:from oscar.apps.partner.strategy import Structured as BaseStructured class Structured(BaseStructured): def fetch_for_product(self, product, stockrecord=None): product_info = super().fetch_for_product(product, stockrecord) # 强制所有商品可购买 product_info.availability.is_available_to_buy = True product_info.availability.message = "在售" return product_info - 第三步:在项目
settings.py中添加配置,指定全局策略类为你自定义的这个类:
配置完成后重启服务,所有可用性校验逻辑都会默认返回可购买状态。OSCAR_STRATEGY = "你的partner app路径.strategy.Structured"
方案2:重写AvailabilitySerializer(不推荐)
这个方案只会修改/api/product/n/availability接口的返回值,不会改动Oscar后台实际的校验逻辑——也就是说前端查可用性接口显示可买,但实际调用加购、结算接口时,后台还是会走原有的可用性判断,很容易出现前端显示正常、实际操作报错的问题。
如果你确定只需要改这个接口的返回、不需要调整后台校验逻辑,可以按下面操作:
- 在你自己的业务app里新建自定义序列化器,继承原生的
AvailabilitySerializer,强制返回固定值:from rest_framework import serializers from oscarapi.serializers.product import AvailabilitySerializer as BaseAvailabilitySerializer class AvailabilitySerializer(BaseAvailabilitySerializer): is_available_to_buy = serializers.BooleanField(read_only=True, default=True) message = serializers.CharField(read_only=True, default="在售") - 重写oscarapi对应的商品可用性视图,指定使用你自定义的序列化器,或者通过oscarapi提供的序列化器配置项替换默认的序列化器类。
注意事项
不要直接修改site-packages里第三方包的源码,否则下次更新依赖、部署换环境的时候改动会直接丢失,所有自定义扩展都按照Oscar官方的fork app规则实现,后续版本升级的兼容成本最低。
内容的提问来源于stack exchange,提问作者destrike
相关产品推荐
相关产品推荐

