2010-11-21 14 views
4

Bazen veritabanından ve bazen de harici bir API'den veri alan bir Django görünümü yazıyorum.Python: Bir nesneye veya sözlüğe nasıl dönüşümlü olarak erişebilirsiniz?

Veritabanından gelince, bu bir Django model örneğidir. Özniteliklere nokta gösterimi ile erişilmelidir.

API'dan gelen veriler bir sözlüktür ve alt simge notasyonu ile erişilebilir. Her iki durumda da, veriler üzerinde bir miktar işlem gerçekleştirilmektedir.

bunu yapmak için daha şık, KURU yol bulmaya çalışıyorum

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']) 

önlemek istiyorum.

Anahtar sözcükler veya nesneler üzerinde çalışan anahtarla/almanın bir yolu var mı?

cevap

6

Sözlüğü, nokta notasyonunu kabul eden bir şeye dönüştüren bir Bunch class kullanabilirsiniz.

+0

Sadece kendi kaynağına baktım, bu basit 'AttrDict' ('__repr__' ve' __delattr__' sağlama ve 'yinelemeli bir dönüşüm yöntemi sağlama' yerine 'KeyError' yerine doğru 'AttributeError' sağlayarak biraz daha parlak bir versiyonu). Şimdiye kadar bulduğumdan şüpheliyim ... "Bunch" oldukça açıklayıcı bir isim gibi görünüyor. –

+1

Bu sınıfı bilmek/bulmak için teşekkürler, bu gerçekten yararlı. – JAL

2

Sonuçların ne olacağını bilmiyorum, ancak sözlüğü kendisine okuyan django modeline bir yöntem ekleyeceğim, böylece modele veri aracılığıyla erişebilirsiniz.

+0

Aslında modelleri özelleştirme konusunda pek çalışmamıştım, bu yüzden bunun ne anlama geldiğinden emin olmadığımı itiraf etmeliyim. ValuesQuerySet'i elde etmek için '.values ​​() 'in kullanılması, model nesnesini bir sözlükte değiştirecek başka bir seçenektir. – JAL

6

JavaScript'te eşdeğerdirler (genellikle yararlıdır; web geliştirme yaptığınızı bilmiyorsanız bunu söylemiştim), ancak Python'da farklılar - [items].attributes.

O __getattr__ kullanarak, nitelikleri aracılığıyla erişim sağlayan şeyler yazmak kolay:

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

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

bunu uzanan bulunuyor gibi bir dict (o, bir parametre olarak bir dict kabul edeceğiz kullanmayı tercih ediyorum Sonra sadece onu kullan dict), ancak item.image_url gibi şeyler yapabilir ve item.image_url ile eşleştirebilir veya alabilirsiniz.

+0

Bu yolu tavsiye ederim ... – swcai

+0

Güzel, güzel öneri. Bunun için tam bir sınıf bulduğu/bildiği için Daniel'in cevabını kabul edeceğim, ama benimki de dahil olmak üzere 7 tane oy aldığınız için çok güzel olmalı. Teşekkürler! – JAL

+0

Evet, fazladan bir bağımlılıktan çekinmiyorsanız (ya da sadece ana ağaca çekmek istiyorsanız), Bunch daha doğru bir çözümdür. Normalde bu yeterli olur, ancak bir tanesi daha doğrudur (KeyError yerine AttributeError ve özellikle 'del' desteği sağlar). Teşekkürler :-) –

İlgili konular