django - एक क्वेरीसेट में खाली या पूर्ण नाम के लिए फ़िल्टरिंग





django-models django-queryset filter null (5)


सबसे पहले, Django दस्तावेज़ दृढ़ता से आधारित फ़ील्ड जैसे CharField या TextField के लिए नल मानों का उपयोग न करने की सलाह देते हैं। स्पष्टीकरण के लिए प्रलेखन पढ़ें:

https://docs.djangoproject.com/en/dev/ref/models/fields/#null

समाधान: मुझे लगता है कि आप QuerySets पर विधियों को एक साथ जोड़ सकते हैं। इसे इस्तेमाल करे:

Name.objects.exclude(alias__isnull=True).exclude(alias="")

यह आपको वह सेट देना चाहिए जिसे आप ढूंढ रहे हैं।

मेरे पास first_name, last_name और उपनाम (वैकल्पिक) है जिसे मुझे खोजना है। इसलिए, मुझे उन सभी नाम देने के लिए एक प्रश्न की आवश्यकता है जिनमें उपनाम सेट है।

केवल अगर मैं कर सकता था:

Name.objects.filter(alias!="")

तो, उपर्युक्त के बराबर क्या है?




Name.objects.filter(alias__gt='',alias__isnull=False)



Django 1.8 से,

from django.db.models.functions import Length

Name.objects.annotate(alias_length=Length('alias')).filter(alias_length__gt=0)



आप यह कर सकते हैं:

Name.objects.exclude(alias__isnull=True)

यदि आपको शून्य मानों और खाली तारों को बाहर करने की आवश्यकता है, तो ऐसा करने का पसंदीदा तरीका इस तरह की स्थितियों को एक साथ जोड़ना है:

Name.objects.exclude(alias__isnull=True).exclude(alias__exact='')

इन तरीकों को एक साथ जोड़ना मूल रूप से प्रत्येक शर्त को स्वतंत्र रूप से जांचता है: उपरोक्त उदाहरण में, हम उन पंक्तियों को बहिष्कृत करते हैं जहां alias या तो खाली या खाली स्ट्रिंग है, इसलिए आपको उन सभी Name ऑब्जेक्ट्स मिलते हैं जिनके पास शून्य, खाली नहीं है। जेनरेट एसक्यूएल कुछ ऐसा दिखता है:

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)

वैकल्पिक रूप से, यदि आपका तर्क उससे अधिक जटिल है, तो आप Django के क्यू ऑब्जेक्ट्स का उपयोग कर सकते हैं:

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

अधिक जानकारी के लिए इस पृष्ठ और इस पृष्ठ को Django दस्तावेज़ों में देखें।

एक तरफ के रूप में: मेरे एसक्यूएल उदाहरण सिर्फ एक समानता हैं - वास्तविक जेनरेट एसक्यूएल कोड शायद अलग दिखाई देगा। वास्तव में आपके द्वारा जेनरेट किए गए एसक्यूएल को देखकर Django क्वेरी कैसे काम करता है, इस बारे में आपको गहरी समझ मिल जाएगी।




'शून्य' के बारे में सोचने का सबसे अच्छा तरीका यह याद रखना है कि डेटाबेस में समान अवधारणा का उपयोग कैसे किया जाता है, जहां यह इंगित करता है कि एक फ़ील्ड में "कोई मूल्य नहीं है।"

  • हां, आइटम का मूल्य ज्ञात है; यह 'परिभाषित' है। इसे शुरू किया गया है।
  • आइटम का मान है: "कोई मूल्य नहीं है।"

यह उन कार्यक्रमों को लिखने के लिए एक बहुत ही उपयोगी तकनीक है जो अधिक आसानी से डीबग किए जाते हैं। एक 'अपरिभाषित' चर एक बग का परिणाम हो सकता है ... (आप कैसे जानते होंगे?) ... लेकिन यदि चर में मान 'शून्य' है, तो आप जानते हैं कि "कोई भी, इस कार्यक्रम में कहीं, इसे सेट करता है 'शून्य' 'इसलिए, मैं सुझाव देता हूं कि, जब आपको किसी चर के मान से छुटकारा पाने की आवश्यकता होती है, तो "हटाएं" न करें ... इसे' शून्य 'पर सेट करें। पुराना मूल्य अनाथ हो जाएगा और जल्द ही कचरा इकट्ठा होगा; नया मान है, "कोई मूल्य नहीं है (अब)।" दोनों मामलों में, चर का राज्य निश्चित है: "जाहिर है, जानबूझकर, उस तरह से मिला।"





django django-models django-queryset filter null