2010-11-21 14 views
4

私はDjangoビューを作成しています。データベースから、時には外部APIからデータを取得することがあります。Python:オブジェクトや辞書にどのようにアクセスできますか?

データベースから来た場合、これはDjangoモデルインスタンスです。属性はドット表記法でアクセスする必要があります。

APIから来るデータは辞書であり、添字表記でアクセスされます。

どちらの場合も、データに対して何らかの処理が行われます。

私はこれを行うにはよりエレガントな、DRYの道を見つけようとしている

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'(' KeyError'ではなく、 'AttributeError'を提供し、' __repr__'と '__delattr__'を提供し、再帰的変換メソッドを提供する) )。私はこれまでに自分自身を見つけたとは思っていません... "バンチ"はかなりわかりにくい名前のようです。 –

+1

このクラスについて知ってくれてありがとう/本当に役に立ちました。 – JAL

2

どのような意味があるのか​​わかりませんが、モデルを使用してデータにアクセスできるように、辞書を読み込むDjangoモデルにメソッドを追加します。

+0

私は実際には多くのモデルをカスタマイズしていませんでしたので、その意味がわかりません。 '.values()'を使ってValuesQuerySetを取得することも、モデルオブジェクトを辞書に変更するオプションです。 – JAL

6

JavaScriptでこれは同等です(ウェブ開発をしているときに分かりませんので参考にします)が、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

+0

ニース、良い提案。彼はこれについて完全なクラスを見つけた/知っていたので、@ Danielの答えを受け入れるつもりですが、私を含めて7つのupvotesがあるので、すばらしくすべきです。ありがとう! – JAL

+0

あなたが余分な依存関係を気にしない(またはメインツリーに取りたいだけなら)、Bunchはより正確な解決策です。通常はこれで十分ですが、KeyErrorの代わりにAttributeErrorが特に正確で、特に 'del'サポートを提供します。ありがとう:-) –

関連する問題