django如何优雅处理这个查询功能(如果对象没找到,那么空对象.price会报错)?

# shop.shop.id asin.id
a = PriceLog.objects.filter(year=2023, month=7, day=10, shop_id=1, asin_id=2).first()
if a:
    print(a.price, a.currency)
else:
    a = ''
    b = ''
阅读 2.3k
2 个回答

没啥特别优雅的方式。

Python 里没有类似 JS/C# 可选链操作符(?.)、也没有 PHP 里安全导航运算符(->?)之类的语法糖,为了防止空指针异常只能一层一层判空处理。即便 getattr() 也只能判断一层(跟 PHP 里的 isset() + 三元表达式的作用类似),你要是个深层的嵌套结构还是得每层都去判断。

为了简化这种判空,你可以使用 glom 这个库(用 Python 搞大数据的基本都知道这个库):

from glom import glom

c = glom(obj, 'a.b.c', default=None)

有点类似 JS 里 lodash.get() 方法,只要 obj.a.b.c 任一一层是空的,直接返回第三个参数默认值;否则才返回最后的结果。

你要是始终都只有一层结构,也可以直接用 getattr(),还少引入一个库。

a = PriceLog.objects.filter(year=2023, month=7, day=10, shop_id=1, asin_id=2).first()
price = getattr(a, 'price', None)
currency = getattr(a, 'currency', None)

if price and currency:
    print(price, currency)
else:
    print("Price or currency not found.")
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进