2010-04-03 4 views
3

''이름 '이라는 필드가있는'Person '모델 개체가 정의되어 있다고 가정 해보십시오. 내가 처음 이름은 리터에 정의 된 이름 목록에서 하지입니다 모든 사람의 기록의 목록을 반환하고 싶은파이썬 목록으로 장고 모델을 필터링 할 수 있습니까?

l = ['Bob','Dave','Jane'] 

: 그리고 나는 사람들의 목록을 가지고있다.

이 작업을 수행하는 가장 비범 한 방법은 무엇입니까?

EDIT : 그것에 대해 생각한 후에, 내가 실제로 시도한 것은 이 사람 테이블에있는이 아님을 나타내는 하위 목록이 있습니다. 이 작업을 효율적으로 처리 할 수 ​​있습니까? 나는 몇 가지 방법을 생각할 수 있지만 얼마나 효율적인지는 모르겠습니다.

+0

"효율적"이지만 "정확함"과 "필요한 것을 수행합니다"를 고려하는 것이 좋습니다. 이것은 진부함이 들리지만 파이썬을 배울수록 파이썬의 한 부분 인 것처럼 보입니다. C의 일반적인 관행은 역사적으로 "정확함"과 "효율적"을 모두 고려했습니다. 파이썬 구문은 시각적으로 기계 번역으로 변환되지 않으므로 언어가 두 언어의 우선 순위를 변경하는 방식으로 바뀌고 있습니다. – msw

답변

3

는 가독성을 위해 l의 이름을 변경

present = Person.objects.values_list('Name', flat=True) 
absent = set(names) - set(present) 
# or, if you prefer named functions to the set operator '-' 
absent = set(names).difference(present) 

예, '차이'의 '오른쪽' t '-') 반복 가능한 모든 것을 허용합니다 (확인하려면 look it up).

+0

이것은 올바른 접근 방법이지만 이름 목록을 얻으려면 목록 이해 대신'Person.objects.values_list ('Name', flat = True ')'를 사용하십시오. –

+0

@ 대니얼 : 감사합니다, 장고 초보자 – msw

+0

@ 대니얼, 확실하지 않습니다. msw의 예제 라인을 다시 쓸 수 있습니까? – Rhubarb

4

이 작업을해야합니다 : (당신의 '편집'단락에서) 두 번째 질문에 대한 답 : :

names = ['Bob','Dave','Jane'] 

Person.objects.[exclude][1](Name__[in][2]=names) 

UPDATE 1 :

Person.objects.exclude(name__in=['Bob','Dave','Jane'])

관련 문제