2010-06-13 11 views
27

Bazen bazı örneklerin bir queryset'ten çıkarıldığından emin olma ihtiyacım var. Ben onlardan daha varsa,Django Alan aramasını kullanmadan queryset'ten belirli örnekleri hariç tutuyor

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

ya:
Bu şekilde Genellikle fazlasını edilir

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

Bu biraz aksak hisseder, bu yüzden denedim:

my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance) 

Hangi çalışmaz. Ancak here on SO'u okudum, bir alt sorgunun hariç tutulabilmesi için parametre olarak kullanılabileceğini.
Şansım kaçıyor mu? Bazı işlevler eksik (docs işaretli, ancak herhangi bir yararlı işaret bulamadık)

cevap

61

Zaten yapmakta olduğunuz yolu en iyi yoldur.

Bunu yapmak için model-agnostik bir yöntemse, query.exclude(pk=instance.pk)'u yapabileceğinizi unutmayın.

bir kenara, eğer Django'nın ORM (o anda değil) bir kimlik eşleyici, o zaman, MyModel.objects.filter(<query>).all().remove(<instance>) böyle bir şey yapmak mümkün olacaktır vardı ama bu konuda şansın yok gibi. Yaptığın (ya da üstünde olan) yolu, sahip olduğun en iyisi.

Oh, ve ayrıca bir liste anlayışı ile bu in sorguda çok daha iyi yapabilirsiniz: query.exclude(id__in=[o.id for o in <unwanted objects>])

+3

, sen inci varsa hariç tutulacak e-queryset (ör. "MyModel.objects.filter ()'), bir "ValuesQuerySet" kullanarak kimlikleri alabilirsiniz: 'id_dicts = MyModel.objects.filter (). Values ​​('id ')' ve [et [ 'query.exclude (id__in =' id_dicts öğenin kimlik']]) '. –

+2

Yaklaşık 4 yıl sonra bu cevap benim problemimi çözdü. :-) – Garfonzo

+2

Sadece @ RacingTadpole'un önerisine bir şey eklemek istedim: Tüm ID'lerin sıralı bir listesini almak için 'values_list (" id ", flat = True)' yi kolayca kullanabilirsiniz. Ancak bu DB'ye çarpacak, bu yüzden Python'un liste kavrayışını kullanmanızı tavsiye ederim. – stschindler

3

Verilen cevap mükemmeldir ve

benim için adım 1)

çalışıyor ki bu deneyin
from django.db.models import Q 

adım 2) Ayrıca

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

Bir 'Q' ifadesini' .exclude'den daha iyi nasıl kullanır (id__in = [ için o oid]>))? – lanzz

+0

bu çok verimsiz bir alternatif gibi görünüyor aynı – kartheek

+0

ulaşmak için bir daha alternatif bir çözümdür. –

İlgili konular