2010-11-21 2 views
4

때때로 데이터베이스에서 데이터를 가져 오거나 외부 API에서 데이터를 가져 오는 장고보기를 작성하고 있습니다.Python : 개체 나 사전에 어떻게 상호 액세스 할 수 있습니까?

데이터베이스에서 왔을 때 장고 모델 인스턴스입니다. 속성은 점 표기법으로 액세스해야합니다.

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

나는 그 의미가 무엇인지 모르겠다.하지만 사전을 읽는 장고 모델에 메서드를 추가하면 모델을 통해 데이터에 액세스 할 수있다.

+0

커스터마이징 모델을 사용하여 실제로 작업 한 것이 아니므로 그 의미가 확실하지 않다는 것을 인정해야합니다. '.values ​​()'를 사용하여 ValuesQuerySet을 얻는 것도 또 다른 옵션입니다.이 옵션은 단순히 모델 객체를 사전으로 변경합니다. – JAL

6

JavaScript에서는 두 가지가 동일합니다. (종종 유용하지만, 웹 개발을 할 때 알려주지 않으므로 언급합니다.)하지만 파이썬에서는 다릅니다. [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' 지원을 제공합니다). 감사합니다 :-) –

관련 문제