मेरे पास Django में एक जटिल डेटाबेस मॉडल स्थापित है, और मुझे फ़िल्टर डेटा के आधार पर कई गणनाएं करनी हैं। मेरे पास Test
ऑब्जेक्ट है, एक TestAttempt
ऑब्जेक्ट, और UserProfile
ऑब्जेक्ट (परीक्षण के लिए एक विदेशी कुंजी के साथ और उपयोगकर्ता प्रोफ़ाइल के लिए एक विदेशी कुंजी)। एक ऐसी विधि है जिसे मैं TestAttempt
पर चलाता हूं जो परीक्षण स्कोर की गणना करता है (प्रत्येक परीक्षण से जुड़े सही उत्तरों की तुलना में कई उपयोगकर्ता द्वारा प्रदान किए गए विकल्पों के आधार पर)। और फिर एक और तरीका जो मैं Test
पर चलाता हूं जो उसके प्रत्येक TestAttempt
के आधार पर औसत परीक्षण स्कोर की गणना करता है लेकिन कभी-कभी मैं केवल TestAttempt
के एक आपूर्ति किए गए सबसेट के आधार पर औसत चाहता हूं जो किसी विशेष सेट से जुड़े होते हैं UserProfiles
का। तो किसी विशेष परीक्षण के लिए औसत परीक्षण स्कोर की गणना करने के बजाय:क्वेरीसेट्स के लिए django __in लुकअप की दक्षता
[x.score() for x in self.test_attempts.all()]
और फिर इन मानों का औसत। मैं इस तरह एक प्रश्न कार्य करें:
[x.score() for x in self.test_attempts.filter(profile__id__in=user_id_list).all()]
जहां user_id_list
UserProfile पहचान-पत्र है जिसके लिए मैं एक सूची के रूप में औसत परीक्षण स्कोर लगाना चाहते हैं का कोई खास सबसेट है। मेरा सवाल यह है: यदि user_id_list
वास्तव में UserProfile
का पूरा सेट है (इसलिए फ़िल्टर self.test_attempts.all()
जैसा ही वापस आ जाएगा) और अधिकांश समय यह मामला होगा, क्या यह इस मामले की जांच करने के लिए भुगतान करता है, और यदि ऐसा है बिल्कुल फ़िल्टर निष्पादित नहीं करते? या __in लुकअप इतना कुशल है कि user_id_list
में सभी उपयोगकर्ता शामिल हैं, यह फ़िल्टर चलाने के लिए अधिक कुशल होगा। साथ ही, क्या मुझे परिणामी test_attempts को अलग() बनाने के बारे में चिंता करने की ज़रूरत है? या वे मेरी क्वेरीसेट की संरचना के साथ डुप्लिकेट को चालू नहीं कर सकते हैं?
संपादित करें:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" WHERE "mc_grades_testattempt"."test_id" = 1
और इस फिल्टर के साथ:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date",
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" INNER JOIN "mc_grades_userprofile" ON
("mc_grades_testattempt"."student_id" = "mc_grades_userprofile"."id") WHERE
("mc_grades_testattempt"."test_id" = 1 AND "mc_grades_userprofile"."user_id" IN (1, 2, 3))
ध्यान दें कि सरणी किसी को जो कच्चे SQL क्वेरी को देख में रुचि है के लिए, यह इस तरह फिल्टर के बिना लग रहा है (1,2,3) सिर्फ एक उदाहरण है
दोनों मामलों में एसक्यूएल जेनरेट किया गया है? –
सुनिश्चित नहीं है, मैं किसी विशेष क्वेरी सेट के लिए SQL को आउटपुट कैसे करूं? संपादित करें, इसे समझ लिया। इसे खोजने के लिए मुझे एक पल दें – ecbtln
एसक्यूएल प्रश्न जोड़े गए हैं – ecbtln