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

السؤال

نشر

لدي نموذج يحتوي على الاسم الأول fName والاسم الأخير lName والاسم المستعار nickName (اختياري nullable) وكنت أريد استعلام عن جميع الأشخاص الذين يملكون اسم مستعار.

وقد حاولت أن أستخدم الكود التالي:

User.objects.filter(nickName!="")

لكن يبدو أن الأمر لم ينجح، كيف أقوم بإستبعاد المستخدمين الذين لا يملكون اسم مستعار؟

Recommended Posts

  • 1
نشر

يمكنك أن تستعمل التابع exclude كالتالي:

User.objects.exclude(nickName__isnull = True)

إذا كنت بحاجة إلى استبعاد القيم الفارغة أيضًا، فبإمكانك القيام بذلك من خلال تجميع الشروط معًا مثل:

User.objects.exclude(nickName__exact = "").exclude(nickName__isnull = True)

في الكود السابق سوف يتم إستبعاد كل القيم الفارغة أو التي تساوي Null

يمكنك أيضًا أن تستعمل التابع Filter كالتالي:

User.objects.filter(nickName__isnull = False, nickName__gt = "")

يقوم الكود السابق بنفس الشيء وستحصل على نفس النتيجة

  • 0
نشر

إضافة للإجابات التي قدمها سامح، يمكنك استخدام:

from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)

أو باستخدام Q:

from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))

أيضاً يمكنك استخدام isempty lookup عام بحيث يمكنك استخدامه مع أي حقل. يمكن استخدامه أيضاً بواسطة django rest_framework أو التطبيقات الأخرى التي تستخدم عمليات بحث django:

from distutils.util import strtobool
from django.db.models import Field
from django.db.models.lookups import BuiltinLookup
@Field.register_lookup
class IsEmpty(BuiltinLookup):
    lookup_name = 'isempty'
    prepare_rhs = False
    def as_sql(self, compiler, connection):
        sql, params = compiler.compile(self.lhs)
        condition = self.rhs if isinstance(self.rhs, bool) else bool(strtobool(self.rhs))
        if condition:
            return "%s IS NULL or %s = ''" % (sql, sql), params
        else:
            return "%s <> ''" % sql, params
# ثم يمكنك استخدامه كالتالي
Name.objects.filter(alias__isempty=False)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...