Saleor 20: 架构 - 处理钱的金额


Saleor 使用 Pricesdjango-prices 库去存储、计算和显示金额、价格与范围。

默认货币

所有价格都输入并存储在由 [DEFAULT_CURRENCY 设置] 控制的单一默认货币中。Saleor 可以以用户本地货币显示价格 (参阅 [Open Exchange Rates integration]),但所有采购均以默认货币收取。

Warning

货币不存储在数据库中。在生产环境中更改默认货币不会重新计算任何现有订单。所有数字将保持不变,并且会被错误地显示为新货币。

Money 和 TaxedMoney

在 Saleor 的代码库中,金额存在 Money 或 TaxedMoney 实例。

Money 是以特定货币表示金额的类型:100 USD 是由 Money(100, ‘USD’) 表示。这种类型不包含对商业有用的任何附加信息,但是与 Decimal 不同,它实施保护和检查以计算和比较货币价值。Money amounts 使用 MoneyField 存储在 model 上,MoneyField 提供货币和储值金额的自己的安全检查。如果您需要使用 Money 对象的 Decimal (十进制数字),您可以在 amount 属性中找到它。

Products (产品)和 shipping methods prices (运输方式价格)使用 MoneyField 进行存储,并假定为 gross amounts (总额)。然后使用 TaxedAmount(net = item.price,gross = item.price)方法将这些金额转换为 TaxedMoney 对象,然后在解决项目的最终价格(税前和折扣前)进行转换。

Note

未来,Saleor 将支持为商店管理员设置更改此方法以使用净值(net values)的方式,如果这更符合他们的业务。

TaxedMoneyRange

有时侯,由于它的变体定义了不同于基准价格的自定义价格,产品可能以不止一个价格出售。对于这样的情况,Product 额外定义了 get_price_range 和 get_gross_price_range 方法,可以返回 TaxedMoneyRange 对象,用于定义启动(start)和停止(stop)属性的最小(minim)和最大(maximum)价格。这个对象然后可以被 UI 使用,使得在产品有不同的变体的情况下显示价格为 “10 USD” 或 “from 10 USD”。

TaxedMoneyRange 还用于显示其他货币范围,例如最小和最大成本(min and maximum cost)以及仪表盘中产品变体的保证金(margin)。