سؤال
أعرف كيفية إنشاء مرشحات وكائنات 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 الخاص بك أولاً.