2009-05-26 23 views

cevap

28

dayanarak, Sadece bir etiket listesini hariç tutmak istediğiniz gibi geliyor.

names_to_exclude = [o.name for o in objects_to_exclude] 
Foo.objects.exclude(name__in=names_to_exclude) 

istediğin bu yapar mı: Yani sadece in filtresi kullanabilirsiniz?

+0

, ben o.name kullanmayın: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd

3

Çağrının yanlış olması, birden çok kez hariç tutuluyor mu? Sorgular tembeldir, sizden veri çekmeye çalışana kadar hiçbir şey olmaz, bu nedenle .exclude() öğesini bir kereden fazla kullanmanın bir dezavantajı yoktur.

+0

Bir etiketler manytomany alanı olan bir model var. Kullanıcı büyük miktarda ihmal etiketine sahip olabilir. Kullanıcının görmek istemediği nesneleri dinamik olarak hariç tutmak istiyorum. Kaç defa arayacağınızı, çalışma saatine kadar hariç tutmayacağım. – Johnd

+0

"Sorgular tembel" ve "verileri ondan çekme" ile ne demek istediğinizi açıklayabilir misiniz? Thnx – akki

+1

Tembel anlamı, sorguyu fiilen kullanana kadar veritabanından hiçbir veri çekilmemesidir. Ben doğrudan objects_to_exclude listesiyle bunu –

4

Sen Q object ile oldukça kolay bir şekilde yapabilirsiniz:

from django.db.models import Q 

excludes = None 
for tag in ignored_tags: 
    q = Q(tag=tag) 
    excludes = (excludes and (excludes | q)) or q # makes sure excludes is set properly 
set_minus_excluded = Foo.objects.exclude(excludes) 

Ayrıca) (dışlamak ile dinamik olarak bunu yapmak mümkün olmalıdır: Ned'e yanıtınız

qs = Foo.objects.all() 
for tag in ignored_tags: 
    qs = qs.exclude(tag=tag) 
0

Ben büyük veri setleri yani pahalı olabilir for döngüsü yerine sorgu kümesi doğrudan gereken değerleri almak için daha iyi olacağını düşünüyorum Daniel Roseman cevabı geliştirmek için

names_to_exclude = objects_to_exclude.values_list('name') 
Foo.objects.exclude(name__in=names_to_exclude) 
-1

Deneyebilirsin bu da.

exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)

İlgili konular