سؤال

لدي 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.

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