2010-06-13 5 views
27

일부 인스턴스가 쿼리 세트에서 제외되어 있는지 확인해야하는 경우가 있습니다. 내가 그들을 더있는 경우,필드 검색을 사용하지 않고 쿼리 세트의 특정 인스턴스를 제외하는 장고

unwanted_instance = MyModel.objects.get(pk=bad_luck_number) 
uninteresting_stuff_happens() 
my_results = MyModel.objects.exclude(id=unwanted_instance.id) 

또는 :
이 방법 나는 보통 그것을 할 것입니다

my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id]) 

이 조금 투박한 '느낌', 그래서 시도 :

my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance) 

다음 중 어떤 것도 작동하지 않습니다. 그러나 나는 하위 쿼리가 exclude에 대한 매개 변수로 사용될 수 있다고 here on SO을 읽었습니다.
나는 운이 없다? 일부 기능이 누락 되었습니까 (문서를 확인했지만 유용한 포인터를 찾지 못했습니다)

답변

61

당신이 이미하고있는 방법이 최선의 방법입니다.

모델을 상상할 수없는 방법으로 찾고있는 경우 query.exclude(pk=instance.pk)을 잊지 마세요.

제쳐두고, 경우 장고의 ORM (이것은 현재하지 않습니다) 신원 매퍼, 다음, MyModel.objects.filter(<query>).all().remove(<instance>)처럼 뭔가를 할 수있을 것이라고했다하지만 당신은 그 점에서 운이있어 것처럼. 당신이하는 방식 (또는 위의 방식)은 당신이 가진 최고의 것입니다.

아, 그리고 또한 당신은 지능형리스트와 그 in 쿼리보다 훨씬 더 수행 할 수 있습니다 query.exclude(id__in=[o.id for o in <unwanted objects>])

+3

, 당신은 일이있는 경우 제외 할 쿼리 세트 (예 : 'MyModel.objects.filter ()')를 사용하면 다음과 같이 'ValuesQuerySet'을 사용하여 ID를 얻을 수 있습니다 : 'id_dicts = MyModel.objects.filter (). values ​​('id ')'그리고 나서 'query.exclude (id__in = [item_id_dicts]의 항목에 대한'id '])'. –

+2

거의 4 년 후이 답변이 내 문제를 해결했습니다. :-) – Garfonzo

+2

@ RacingTadpole의 제안에 뭔가를 추가하고 싶었습니다 :'values_list ("id", flat = True)'를 사용하면 모든 ID의 순차적 목록을 쉽게 얻을 수 있습니다. 그러나 이것은 DB에 영향을 미치므로 파이썬의리스트 이해력을 사용하도록 제안 할 것입니다. – stschindler

3

주어진 대답은 완벽하고

나를 위해 1 단계)

를 잘 작동하는이 시도
from django.db.models import Q 

2 단계) 또한

MyModel.objects.filter(~Q(id__in=[o.id for o in <unwanted objects>])) 
+9

'.exclude (id__in = [원하지 않는 객체]에서 o에 대해 o.id)'보다'Q '표현식을 사용하는 방법은 무엇입니까? – lanzz

+0

이것은 동일한 것을 달성하기위한 또 하나의 대안 솔루션입니다. – kartheek

+0

그것은 매우 비효율적 인 대안으로 보입니다. –

관련 문제