From 38390ae01f2280d859813d824954fe11b6a85788 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sun, 6 Sep 2026 17:21:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(pricing):=20get=5Fpricing=5Fdisplay=20?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=91=BD=E4=B8=AD=E5=B4=A9=E2=80=94=E2=80=94?= =?UTF-8?q?get=5Fppid=5Fpricing=20=E8=BF=94=E5=9B=9E=20dict=20=E6=97=B6=20?= =?UTF-8?q?r.pricing=5Fdata=20=E6=8A=9B=20AttributeError?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:get_ppid_pricing 走 Redis 缓存命中返回 dict(JSON 反序列化),未命中返回 DictObject(sqlor 行对象)。get_pricing_display 里 r.pricing_data 在 try 块外用 属性访问,缓存命中即抛 AttributeError → 展示价间歇性返回'定价数据为空'。 buffered_charging 早做了 hasattr 兼容,get_pricing_display 漏了同款处理。 修复:hasattr(r,'pricing_data')/isinstance dict/r['pricing_data'] 三路兼容。 --- pricing/pricing.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pricing/pricing.py b/pricing/pricing.py index 98cc0fe..cbc37ee 100644 --- a/pricing/pricing.py +++ b/pricing/pricing.py @@ -803,7 +803,15 @@ async def get_pricing_display(ppid, model=None): r = await PricingProgram.get_ppid_pricing(ppid) except Exception: return None - pricing_data_str = r.pricing_data + # get_ppid_pricing 缓存命中时返回 dict(Redis JSON 反序列化), + # 未命中时返回 DictObject(sqlor 行对象),两者都要兼容(同 buffered_charging 的处理, + # 2026-09-06 修复:此前缓存命中即抛 AttributeError 致展示价间歇性"定价数据为空")。 + if hasattr(r, 'pricing_data'): + pricing_data_str = r.pricing_data + elif isinstance(r, dict): + pricing_data_str = r.get('pricing_data') + else: + pricing_data_str = r['pricing_data'] d = yaml.safe_load(pricing_data_str) if not d: raise Exception(f'{ppid} pricing_data 为空')