2010-11-21 21 views
4

我正在寫一個Django視圖,有時從數據庫獲取數據,有時從外部API獲取數據。Python:你如何可以互換地訪問一個對象或字典?

當它來自數據庫時,它是一個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']) 

我試圖找到一個更優雅的,乾的方式來做到這一點。

有沒有一種方法可以通過對字典或對象起作用的鍵進行設置?

回答

6

您可以使用Bunch class,它將字典轉換爲接受點符號的東西。

+0

剛剛看過它的源代碼,這是我簡單的'AttrDict'(提供正確的'AttributeError'而不是'KeyError',提供'__repr__'和'__delattr__'並提供遞歸轉換方法)。我懷疑我自己是否曾經發現它......「Bunch」似乎是一個相當不具描述性的名字。 – 2010-11-21 12:41:31

+1

感謝您瞭解/發現本課程,這真的很有幫助。 – JAL 2010-11-22 02:09:31

2

我不知道會有什麼影響,但是我會在django模型中添加一個方法,它將字典讀入本身,以便您可以通過模型訪問數據。

+0

我還沒有真正的定製模型,所以我不得不承認我不知道這意味着什麼。使用'.values()'獲得一個ValuesQuerySet也是另一種選擇,它可以簡單地將模型對象轉換爲字典。 – JAL 2010-11-21 11:29:19

6

在JavaScript中它們是等價的(通常很有用;如果您不知道您正在進行Web開發,我會提及它),但在Python中它們不同 - [items].attributes

可以很容易地寫一些東西,允許通過屬性的訪問,使用__getattr__

class AttrDict(dict): 
    def __getattr__(self, attr): 
     return self[attr] 

    def __setattr__(self, attr, value): 
     self[attr] = value 

那麼就使用它,你會使用一個dict(它會接受一個dict作爲參數,因爲它的擴展dict),但你可以做一些事情,比如item.image_url,它會將它映射到item.image_url,獲取或設置。

+0

我推薦這種方式... – swcai 2010-11-21 11:42:24

+0

不錯,很好的建議。我會接受@丹尼爾的回答,因爲他發現/瞭解了一個完整的課程,但它應該很酷,因爲你有7個upvotes,包括我的。謝謝! – JAL 2010-11-22 02:10:27

+0

是的,如果你不介意額外的依賴(或者只是想把它拉進主樹),Bunch是一個更準確的解決方案。通常這是足夠的,但更準確的是(AttributeError而不是KeyError並且特別提供'del'支持)。感謝:-) – 2010-11-22 02:15:07

相關問題