سؤال

هل هناك طريقة للقيام باستفسار واستبعاد قائمة الأشياء، بدلا من الاتصال باستثناء عدة مرات؟

هل كانت مفيدة؟

المحلول

بناء على ردكم على NED، يبدو أنك تريد فقط استبعاد قائمة العلامات. لذلك يمكنك فقط استخدام in منقي:

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

هل هذا يفعل ما تريد؟

نصائح أخرى

ما الخطأ في الدعوة استبعاد عدة مرات؟ لا يحدث استفسارات كسول، لا يحدث شيء حتى تحاول سحب البيانات منه، لذلك لا يوجد جانب سلبي لاستخدام. exclude () أكثر من مرة.

يمكنك أن تفعل ذلك بسهولة مع كائن س:

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)

يجب أن تكون قادرا أيضا على القيام بذلك بشكل حيوي مع استبعاد ():

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

لتحسين إجابة Daniel Roseman، أعتقد أنه سيكون من الأفضل الحصول على القيم التي تحتاجها مباشرة من QuerySet بدلا من حلقة قد تكون مكلفة على مجموعات البيانات الكبيرة IE

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

يمكنك تجربة هذا أيضا.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top