Sorgulama yapmak ve birden çok kez dışarıda çağırmak yerine bir şeylerin listesini hariç tutmak için bir yol var mı?Django nesnesi çoklu exclude()
cevap
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?
Ç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.
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
"Sorgular tembel" ve "verileri ondan çekme" ile ne demek istediğinizi açıklayabilir misiniz? Thnx – akki
Tembel anlamı, sorguyu fiilen kullanana kadar veritabanından hiçbir veri çekilmemesidir. Ben doğrudan objects_to_exclude listesiyle bunu –
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)
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)
Deneyebilirsin bu da.
exclude_list = ['A', 'B', 'C'] qs = Foo.objects.exclude(items__in=exclude_list)
, ben o.name kullanmayın: ignore_tags = request.user.ignore_tags.all() case_list = Case.objects.exclude (tags__in = ignore_tags)) – Johnd