سؤال

أعرف كيفية إنشاء مرشحات وكائنات Q في Django ، لكنني لا أعرف كيفية نفي المشغلين التي يوفرها واجهة برمجة التطبيقات ، على سبيل المثال للمشغل يحتوي على شيء مثل notcontains.

على سبيل المثال

q=Q(name__notcontains="SomeString")

هذا من شأنه أن يجعلني كل الأشياء التي لا تحتوي اسمها على "أمر".

هل هناك بعض بناء الجملة الذي أفتقده؟

شكرًا لك.

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

المحلول

يمكنك استخدام exclude() بدلاً من filter():

Entry.objects.exclude(name__contains="SomeString")

("أعطني كل الإدخالات باستثناء تلك مع names يحتوي على "شيء ما")

وعند التعامل مع كائن Q ، يمكنك استخدام رمز "~" قبل كائن Q لتمثيل النفي. على سبيل المثال ، يعني البيان التالي "أعطني كل الإدخالات مع names يحتوي على "فيل" ، ولكن لا يحتوي على "شيء ما":

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

في بعض الحالات ، قد ترغب في استخدام كلتا الطريقتين:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

("أعطني كل الإدخالات ، باستثناء تلك مع names يحتوي على "فيل" ، ولكن لا يحتوي على "شيء ما")

نصائح أخرى

ها هي QuerySet API مرجع. exclude يبدو أن تفعل ما تريد.

إما الاستخدام exclude كما يقترح هانك أو ، على وجه الخصوص contains الحالة ، استخدم Q (name__regex = r '! (SomeString)') إذا كنت بحاجة حقًا إلى استخدام filter. تحذير على الرغم من ذلك regex ليس قاعدة البيانات ، تحقق من بناء جملة DB الخاص بك أولاً.

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