मैं दो क्वेरीसेट को मर्ज करने से एक क्वेरीसेट प्राप्त करने का प्रयास कर रहा हूं। शर्तें इस प्रकार हैं:

  • केवल 20 आइटम खींचो
  • डेटाबेस को केवल एक बार हिट करें
  • परिणामी क्वेरीसेट में वही ऑब्जेक्ट होना चाहिए जो इस प्रश्न में मेरा कोड उत्पन्न करता है

आइए कहें कि मेरे पास माईमोडेल नामक एक मॉडल है, जिसमें मान नामक फ़ील्ड है जो पूर्णांक संग्रहीत करता है, हालांकि, मान शून्य हो सकता है।

मुझे पता है कि Django में क्वेरीसेट आलसी हैं, लेकिन मुझे यकीन नहीं है कि कोड की निम्न पंक्ति में शर्तों को पूरा किया जा रहा है या नहीं।

qs = MyModel.objects.exclude(value__isnull=True).filter(value__gte=250).order_by('-value') | MyModel.objects.exclude(value__isnull=False)
objects = qs[:20]

मूल रूप से, मैं पहले फ़िल्टर कर रहा हूं जहां मूल्य शून्य नहीं है, उन्हें मूल्य के अनुसार आदेश दे रहा है, और फिर अंत में, मैं बाहर किए गए लोगों को जोड़ रहा हूं। क्या यह मेरी शर्तों को पूरा कर रहा है? यानी डेटाबेस को एक बार हिट किया जा रहा है? इसके अलावा, क्या | ऑपरेटर के बिना ऐसा करने का कोई बेहतर तरीका है?

नोट: मुझे पता है कि यह क्वेरीसेट को मर्ज किए बिना किया जा सकता है, लेकिन इस प्रश्न के लिए, मान लें कि इस तरह के 2 क्वेरीसेट होना बिल्कुल आवश्यक है।

संपादित करें: तीसरी शर्त जोड़ी गई, जो मैंने सोचा था कि निहित थी। मेरा बुरा।

0
darkhorse 9 अक्टूबर 2018, 17:50

1 उत्तर

सबसे बढ़िया उत्तर

हाँ यह काम करता है जैसा आप कहते हैं। यह संघ का गैर-दस्तावेज कार्यान्वयन है क्वेरीसेट का। यह केवल एक बार डेटाबेस को हिट करेगा।

आप यह सत्यापित कर सकते हैं कि इसे print(qs.query) द्वारा एक प्रश्न के लिए बाध्य किया गया है

साथ ही मैं अक्सर पूछे जाने वाले प्रश्न: मैं कैसे देख सकता हूं कि Django की कच्ची SQL क्वेरी चल रही है?

from django.db import connection
connection.queries

यह आपको डेटाबेस को हिट करने वाले प्रश्नों का निरीक्षण करने की अनुमति देगा

1
Kamil Niski 9 अक्टूबर 2018, 15:31