ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

InvenTree 0.5.4 补丁版本解析:供应商价格校验与 SupplierPart 定价链路

InvenTree 0.5.4 补丁版本解析:供应商价格校验与 SupplierPart 定价链路 InvenTree 0.5.4 补丁版本解析供应商价格校验与 SupplierPart 定价链路【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTreeInvenTree 0.5.4 是 0.5.x 稳定分支上的一个缺陷修复版本bug-fix release核心变更聚焦于提交非法供应商价格值时触发服务器错误的修复。本指南以该版本发布说明为骨架结合当前仓库0.5.x之后的源码实现深入剖析供应商价格Supplier Price的模型约束、序列化器校验逻辑、价格区间计算原理以及相关 API 测试用例帮助读者理解 InvenTree 如何从数据层到 API 层完整防护非法价格输入。版本定位0.5.x 稳定分支的缺陷修复版本发布说明明确写道Release 0.5.4 is a bug-fix release on the 0.5.x stable branch0.5.4 不引入新功能而是对 0.5.x 稳定分支中发现的缺陷进行定点修复此类补丁版本只包含缺陷修复Bug Fixes不会包含破坏性变更或大的功能开发。本次补丁仅包含一项修复条目Pull Request描述#2202修复提交非法供应商价格值时出现的服务器错误Fixes server error when submitting invalid supplier price value该 PR 描述的是提交非法供应商价格值导致 500 服务器错误这一问题即用户在 API 或界面上传入无法解析的价格如空值、非法字符串、非数字等时后端抛出未捕获异常导致返回 500 Internal Server Error而非合理的 400 校验错误响应。供应商价格的数据模型SupplierPriceBreak要理解这次修复的实质需要先了解供应商价格值在 InvenTree 中的落点——供应商价格区间SupplierPriceBreak。在 公司模块模型定义 中SupplierPriceBreak继承自通用抽象基类PriceBreak定义于 通用模型quantity价格区间数量RoundingDecimalFieldmax_digits15、decimal_places5默认1并通过MinValueValidator(1)保证最小值为 1price指定数量下的单价unit priceInvenTreeModelMoneyFieldmax_digits19、decimal_places6允许nullTrue抽象基类还提供convert_to(currency_code)方法用于把该区间单价换算到指定币种换算失败缺汇率时记录日志并可选择抛出异常。SupplierPriceBreak在子类中补充了与SupplierPart的关联外键related_namepricebreaks并在Meta中通过unique_together (part, quantity)保证同一个供应商零件在同一数量下只能有一个价格区间。它的字符串表示直接体现SKU - 价格 数量三元组def __str__(self): return f{self.part.SKU} - {self.price} {self.quantity}这里的price即本次补丁所保护的供应商价格值字段。由于它使用InvenTreeModelMoneyField同时携带币种属性price_currency非法值既包括无法解析为数字的情况也包括数字合法但币种非法等情形。校验修复落点序列化器的强制校验修复 PR 的核心落点在于序列化器层。在 供应商价格序列化器 中price InvenTreeMoneySerializer(allow_nullTrue, requiredTrue, label_(Price))SupplierPriceBreakBriefSerializer将price字段声明为requiredTrue提交载荷中必须携带该字段缺失直接返回校验错误allow_nullTrue显式允许空值从而将空价格从服务器异常路径转入 DRFDjango REST Framework的正常校验路径由序列化器返回 400 校验错误而不是在视图或模型层抛 500InvenTreeMoneySerializer负责把原始输入解析为Money对象非法字符串如abc、not a number会被标准解析流程拦截。这套配置正是 #2202 修复的典型形态让非法供应商价格值落在序列化器校验环节被优雅拒绝。完整的SupplierPriceBreakSerializer同一文件在其基础上追加supplier_detail与part_detail嵌套详情字段并通过annotate_queryset对part、part__supplier、part__part做select_related预取以降低查询开销。API 端点与请求示例SupplierPriceBreak的 API 端点为api-part-supplier-price-list见 模型定义即/api/part/supplier-price/系列。合法的创建/更新请求体大致如下{ part: 3, quantity: 10, price: 12.50, price_currency: USD }而以下非法输入都会返回400 校验错误而非 500 服务器错误// 缺少必填字段 price {part: 3, quantity: 10}// price 无法解析为合法数字 {part: 3, quantity: 10, price: not-a-number}// price 为空值 {part: 3, quantity: 10, price: }从价格区间到实际报价get_price 定价链路修复保证了非法价格值无法进入数据库而合法价格区间随后会被 通用定价函数get_price消费形成完整的数量 → 单价报价链路。其核心逻辑如下无价格区间兜底若该SupplierPart没有关联任何price_breaks直接返回None表示暂无报价依据订单倍数向上取整当multiplesTrue且数量为整数时将数量向上取整到instance.multiple的整数倍ceil(quantity / multiple) * multiple命中最大适用区间遍历价格区间跳过quantity 数量的区间保留满足条件的最大区间单价即购买量越大适用越低单价并通过convert_to(currency)统一换算到目标币种最小区间兜底若数量低于所有区间的起点MOQ 语义则回退到最小数量区间的单价合计成本命中后返回单价 × 数量 base_cost基础附加费用如卷带费 Reeling Fee并经过normalize归一化处理。SupplierPart模型还通过has_price_breaks、unit_pricing单件价格等属性暴露这些计算结果见 模型定义前端界面与采购订单行均依赖该链路做成本预估。值得注意的是SupplierPart与SupplierPriceBreak都注册了 Djangopost_save/post_delete信号见 模型定义一旦价格数据发生变化会自动调用base_part.schedule_pricing_update()把最新报价传播到零件定价与 BOM 成本汇总中。这意味着本次补丁修复的非法价格值若未被序列化器拦截而污染数据库会进一步扩散到整条成本核算链路——这正是将校验前置到序列化器层的重要意义。测试证据校验行为被显式验证当前仓库的 API 测试用例company/test_api.py体现了同类的校验行为可作为 #2202 修复思路的旁证第 717–723 行向SupplierPartAPI 提交available: not a number断言返回400且响应体中包含A valid number is required校验信息第 864 行起SupplierPriceBreakAPITest专门针对价格区间 API 编写单元测试覆盖列表获取、按供应商零件过滤等行为。这些测试表明InvenTree 对非法数值输入的统一策略是在 DRF 序列化器/字段解析层返回 400 校验错误而非放任其进入模型层抛出 500。这与 0.5.4 发布说明中 #2202 的修复目标完全一致。小结InvenTree 0.5.4 作为 0.5.x 稳定分支的缺陷修复版本只包含 #2202 一项变更但其技术意义并不小问题本质非法供应商价格值未被序列化器拦截导致服务器 500 错误修复形态在SupplierPriceBreakSerializer中将price声明为requiredTrue、allow_nullTrue的InvenTreeMoneySerializer字段使非法值进入 DRF 标准校验路径防护纵深模型层MinValueValidator(1)保证数量下限、unique_together保证唯一性序列化器层拦截非法值信号层在数据合法变更后联动更新零件定价与 BOM 成本。对于使用或二次开发 InvenTree 的团队而言本版本揭示的最佳实践是所有用户可控的数值输入都应在序列化器层完成强校验避免异常数据穿透到模型保存与信号回调阶段。更完整的补丁历史可继续查阅 发布说明目录 与 0.5.x 版本发布说明。【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表