اذهب إلى المحتوى

السؤال

نشر

في نموذج QuerySets في جانغو Django، أرى أن هناك __gt و __lt لمقارنة القيم، لكن هل هناك __ne أو! = (not equals)؟ أريد تصفية النتائج باستخدام شرط لا يساوي. على سبيل المثال:

Model:
    bool x;
    int y;

أريد أن أقوم بـ :

results = Model.objects.exclude(x=True, y!=10)

لكن هذه الطريقة لم تفلح، لذلك أستخدم الكود التالي:

results = Model.objects.exclude(x=True, y__lt=10).exclude(x=True, y__gt=10)

لكن أعتقد أن الكود السابق ليس عملي ويسبب بطيء أثناء التنفيذ، لذلك هل توجد طريقة لعمل شرط "لا يساوي" في جانغو Django؟

Recommended Posts

  • 0
نشر

يمكنك استخدام كائنات Q لهذا الشيء,  يمكن نفيها باستخدام عامل التشغيل ~ ودمجها تمام

from django.db.models import Q
object_list = QuerySet.filter(x=True, ~Q(y=10))

أو هناك طريقة أخرى وهي استخدام filter بدلا من exclude كالتالي

results = Model.objects.exclude(x=True).filter(y=10)

 

  • 1
نشر

هناك 3 طرق:الأولى استخدام Q() objects مع  معامل النفي ~:

from django.db.models import Q
r = QuerySet.filter(~Q(a=True), x=5)

والثانية استخدام exclude مع filter:

r = Model.objects.exclude(a=True).filter(x=5)

والثالثة هي إنشاء custom lookup لكن أولاً عليك إنشاء lookup بنفسك:

from django.db.models import Lookup
class check(Lookup):
    #lookup اسم ال
    lookup_name = 'ne'
    def as_sql(self, compiler, connection):
        lhs, lhs_params = self.process_lhs(compiler, connection)
        rhs, rhs_params = self.process_rhs(compiler, connection)
        params = lhs_params + rhs_params
        return '%s <> %s' % (lhs, rhs), params
# ثم نقوم بتسجيله
from django.db.models import Field
Field.register_lookup(check)
#في استعلامك __ne lookup الآن يمكنك استخدام 
results = Model.objects.exclude(a=True, x__ne=5)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...