2012-03-05 2 views
1

면책 조항 : 저는 Python과 Django를 처음 사용하지만 Drupal 프로그래밍 경험이 있습니다.초보자 : 쿼리 세트 결과 검사

나는 결과가 것을 이해 내가 (http://www.djangobook.com/en/2.0/chapter05/) 여기 자습서를 다음 해요,하지만 난

Publisher.objects.filter(name='Apress') 
[<Publisher: Apress>] 

에 의해 혼동 해요 Queryset Object, 그래서 다음의 접근법이 실패 할 때 주소 (또는 프라이 머리 키)를 어떻게 찾을 수 있습니까?

p = Publisher.objects.filter(name='Apress') 
a = p.address 
'QuerySet' object has no attribute 'address' 

고마워요!

답변

3

속성은 모델 인스턴스에서만 사용할 수 있습니다. QuerySet은 단순하게 모델 인스턴스의 목록처럼 단순하므로 특정 인스턴스와 그 속성을 얻기 위해 어떻게 든 압축을 풀어야합니다.

당신은 단지 당신이 질의하고있는 것 중 하나가 있다는 것을 알고 있다면, 당신은 대신 필터의 get을 사용한다 : 다수의 일치가 반환하는 경우

publisher = Publisher.objects.get(name='Apress') 
print publisher.address 

그러나, 그것은 MultipleObjectsReturned 예외를 발생합니다, 반대로, 일치하는 것이 발견되지 않으면 ObjectDoesNotExist 예외가 발생합니다. 결과적으로 get을 사용할 때는주의해야하며 적절한 try...except 블록에 코드를 입력해야합니다. 당기 직접

for publisher in Publisher.objects.all(): 
    print publisher.address 

을 또는 : 당신은 하나 개 이상의 결과를 기대하는 뭔가를 처리하는 경우

, 당신은 QuerySet에서 각 항목을 처리하는 루프 구조의 일종을 사용 할 수 있습니다 기존 목록과 마찬가지로 하나의 항목을 만들 수 있습니다.

first_publisher = Publisher.objects.all()[0] 
print first_publisher.address 
+0

우수한 세부 사항 Chris. 정말 고맙습니다! –

+0

이 답변이 내 세부 정보보다 더 좋다고 생각합니다. 부드러운 노란색 나는 그것을 받아 들일 수 있다고 생각한다! 진드기! :) –

2

아마 대신 get 함수를 호출해야합니다 당신은 address 속성에 액세스하려면 각 항목을 통해 루프를해야합니다 있도록

p = Subject.objects.get(name='Apress') 
+0

감사 Thanasis. 그게 효과가 있었어. get()을 사용하는 것이 두려웠습니다. 하나의 결과가 반환되어야하기 때문입니다. "쿼리와 일치하는 결과가 없으면 get()은 DoesNotExist 예외를 발생시킵니다." 그래서, objects.all()이나 objects.filter()는 객체의 * list * (여러 개의 일치를 가정 할 때)를 얻는 반면, get은 단일 객체를 반환한다고 가정합니다. –

+1

당신은 try 블록을 추가하여 던져진 예외를 잡을 수 있습니다. 자세한 내용은 http://wiki.python.org/moin/HandlingExceptions –

1

귀하의 검색어 세트는 기본적으로 목록입니다. 이런 식으로 뭔가 : 당신이 get 반환 당신이 하나 개의 객체를 사용하기 때문에 위의 @Thanasis '조언을 따른다면

for p in Publisher.objects.filter(name='Apress'): 
    # access p.address here 

귀하의 구문이 작동합니다.

+0

Abid A! –