我正在编写一个Django视图,有时会从数据库中获取数据,有时也会从外部API获取数据。
当它来自数据库时,它是一个Django模型实例。必须使用点表示法访问属性。
来自API,数据是字典,可通过下标表示法访问。
在任何一种情况下,都会对数据进行一些处理。
我想避免
if from_DB:
item.image_url='http://example.com/{0}'.format(item.image_id)
else:
item['image_url']='http://example.com/{0}'.format(item['image_id'])
我正试图找到一种更优雅,干燥的方式来做到这一点。
有没有办法通过适用于词典或对象的键来获取/设置?
答案 0 :(得分:6)
在JavaScript中它们是等价的(通常很有用;我提到它以防你不知道你正在进行Web开发),但在Python中它们是不同的 - [items]
与{{1} }。
使用.attributes
:
__getattr__
然后只需使用它就可以使用class AttrDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
(它会接受dict
作为参数,因为它正在扩展dict
),但您可以执行{dict
之类的操作{1}}它会将其映射到item.image_url
,获取或设置。
答案 1 :(得分:6)
您可以使用Bunch class,它将字典转换为接受点表示法的内容。
答案 2 :(得分:2)
我不知道其含义是什么,但是我会在django模型中添加一个方法,该方法将字典读入自身,因此您可以通过模型访问数据。