تصفية فارغة أو فارغة الأسماء في queryset
-
20-08-2019 - |
سؤال
لدي first_name, last_name & المستعار (اختياري) التي تحتاج إلى البحث عن.لذا أنا بحاجة الاستعلام أن تعطيني جميع الأسماء التي مستعار مجموعة.
إلا إذا كان يمكنني أن أفعل:
Name.objects.filter(alias!="")
حتى ما يعادل أعلاه ؟
المحلول
هل يمكن أن تفعل هذا:
Name.objects.exclude(alias__isnull=True)
إذا كنت تحتاج إلى استبعاد القيم الخالية <م> و م> السلاسل الفارغة، والطريقة المفضلة للقيام بذلك هي لسلسلة معا الظروف مثل ذلك:
Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')
وتسلسل هذه الأساليب معا في الأساس يتحقق كل حالة بشكل مستقل: في المثال أعلاه، فإننا استبعاد الصفوف حيث alias
إما باطل <م> أو م> سلسلة فارغة، حتى تحصل على كافة الكائنات Name
التي لها يست لاغية ، الحقل alias
يست فارغة. ان SQL ولدت تبدو شيئا مثل:
SELECT * FROM Name WHERE alias IS NOT NULL AND alias != ""
ويمكنك أيضا تمرير الوسائط متعددة لمكالمة واحدة إلى exclude
، التي من شأنها ضمان أن الأجسام الوحيدة التي تلبي <م> كل م> حالة الحصول على استبعدت:
Name.objects.exclude(some_field=True, other_field=True)
وهنا، في الصفوف التي some_field
<م> و م> other_field
صحيحا الحصول على استثناء، حتى نحصل على كافة الصفوف حيث كلا الحقلين ليست صحيحة. سيكون رمز SQL ولدت تبدو قليلا مثل هذا:
SELECT * FROM Name WHERE NOT (some_field = TRUE AND other_field = TRUE)
وبدلا من ذلك، إذا المنطق الخاص بك هو أكثر تعقيدا من ذلك، يمكنك استخدام جانغو <لأ href = "https://docs.djangoproject.com/en/dev/ref/models/querysets/#q-objects" يختلط = "noreferrer"> Q الكائنات :
from django.db.models import Q
Name.objects.exclude(Q(alias__isnull=True) | Q(alias__exact=''))
لمزيد من المعلومات انظر هذه الصفحة و <لأ href = "https://docs.djangoproject.com/en/dev/ref/models/querysets" يختلط = "noreferrer"> هذه الصفحة في مستندات جانغو.
<الفرعية> بوصفها جانبا: أمثلة SQL بلادي هي مجرد التشبيه - وربما رمز SQL ولدت الفعلي تبدو مختلفة. ستحصل على فهم أعمق لكيفية الاستعلامات جانغو العمل من خلال النظر في الواقع في SQL التي تولدها. الفرعي>
نصائح أخرى
Name.objects.filter(alias__gt='',alias__isnull=False)
أولا، مستندات جانغو نوصي بشدة عدم استخدام قيم فارغة للحقول القائمة على سلسلة مثل CharField أو الحقل النصي. قراءة الوثائق للشرح:
https://docs.djangoproject.com/en/dev / المرجع / نماذج / الحقول / # اغية
والحل: يمكنك أيضا سلسلة معا الأساليب على مجموعات طلبات البحث، على ما أعتقد. جرب هذا:
Name.objects.exclude(alias__isnull=True).exclude(alias="")
وهذا يجب أن يوفر لك مجموعة كنت تبحث عنه.
ومن جانغو 1.8،
from django.db.models.functions import Length
Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)
لتجنب الأخطاء الشائعة عند استخدام exclude
, تذكر:
يمكنك لا إضافة متعددة الشروط في وهو استبعاد() كتلة مثل filter
.استبعاد عدة شروط يجب استخدام متعددة استبعاد()
على سبيل المثال
غير صحيحة:
المستخدم.الكائنات.تصفية(email='example@example.com').استبعاد(الملف الشخصي__نيك_name=", الملف الشخصي__avt=")
الصحيح:
User.objects.filter(email='example@example.com').exclude(profile__nick_name=").exclude(profile__avt=")
وهذا هو طريقة بسيطة أخرى للقيام بذلك.
Name.objects.exclude(alias=None)
ويمكنك ببساطة قيام بذلك:
Name.objects.exclude(alias="").exclude(alias=None)
وانها في الحقيقة مجرد بهذه البساطة. يستخدم filter
لمباراة وexclude
هو تطابق كل شيء ولكن ما يحدد ذلك. وهذا من شأنه تقييم إلى SQL كما NOT alias='' AND alias IS NOT NULL
.