एकल क्षेत्र का चयन करने वाले मॉडल


102

मेरे पास एक टेबल / मॉडल है, जिसे Employeesमैं एक एकल फ़ील्ड की सभी पंक्तियों को क्वेरीसेट के रूप में प्राप्त करना चाहूंगा।

मुझे पता है कि मैं इसे इस तरह कर सकता हूं (आशा है कि मैं यह अधिकार भी कर रहा हूं):

emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name

सभी क्षेत्रों के लिए डेटाबेस को क्वेरी करेगा और केवल एक का उपयोग कर? क्या ऐसा करने का एक बेहतर (तेज) तरीका है?


क्या आप "और केवल एक का उपयोग करके" मतलब है? इसके SELECT colबजाय SELECT *?
सिरो सेंटिल्ली 郝海东 冠状 iro i 法轮功 '

जवाबों:


182
Employees.objects.values_list('eng_name', flat=True)

यह सभी eng_names की एक फ्लैट सूची बनाता है । यदि आप प्रति पंक्ति एक से अधिक फ़ील्ड चाहते हैं, तो आप एक सपाट सूची नहीं कर सकते हैं: इससे ट्यूपल्स की एक सूची बन जाएगी:

Employees.objects.values_list('eng_name', 'rank')

उत्तर के लिए धन्यवाद, क्या होगा यदि मैं केवल 1 या अधिक फ़ील्ड (सभी नहीं) का चयन करना चाहता हूं?
zentenk

क्षमा करें, मुझे यह प्रश्न समझ में नहीं आया।
डैनियल रोसमैन

3
कृपया दस्तावेज़ साझा करें। यह दूसरों की मदद करेगा
बॉब मार्टी

25

डैनियल उल्लेख केvalues_list रूप में इसके अलावा आप (या विपरीत प्रभाव के लिए) वस्तुओं की एक क्वेरी प्राप्त करने के लिए केवल उनकी आईडी और निर्दिष्ट अनुभागों का उपयोग कर सकते हैं : onlydefer

Employees.objects.only('eng_name')

यह एक एकल क्वेरी चलाएगा:

SELECT id, eng_name FROM employees

3
यह कमांड मुझे मेरे Django संस्करण 2.1.3 और अजगर संस्करण 3.6.2 के लिए सभी फ़ील्ड लौटा रहा है।
अनंथी

यह केवल एक ही दायर करेगा, लेकिन यदि आप अन्य क्षेत्रों तक पहुंचने का प्रयास करते हैं, तो एक अलग डेटाबेस क्वेरी निष्पादित की जाएगी। तो यह एक अच्छा अनुकूलन तकनीक है, लेकिन सुनिश्चित करें कि आप इन अतिरिक्त प्रश्नों को नहीं बनाते हैं। अन्यथा आप इसे प्राप्त करने के बजाय प्रदर्शन खो देंगे।
इरिक स्वेन पूडिस्ट

6

हम मानों पर आवश्यक फ़ील्ड चुन सकते हैं।

Employee.objects.all().values('eng_name','rank')

क्वेरी को सफलतापूर्वक चलाने के बाद, किसी चर में फ़ील्ड के मान को कैसे संग्रहीत किया जाए, जैसे। var_name = <query_name>। field_name> ?
user12379095

@ user12379095 बस की तरह इस:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095 और फिर इस var_name का उपयोग करने के लिए - उदाहरण के लिए: सभी कर्मचारियों के नाम और रैंक को प्रिंट करें, आप ऐसा कर सकते हैं:for person in var_name: print(person['eng_name'] + " " + person['rank'])
TheQuestionMan

3

ऑस्कर पेरसन के जवाब सबसे अच्छा तरीका है इसे संभाल करने के लिए क्योंकि आसान बना देता है को डेटा पास करने के लिए है संदर्भ और से सामान्य रूप से यह इलाज टेम्पलेट के रूप में हम वस्तु उदाहरणों (आसानी से iterable रंगमंच की सामग्री प्राप्त करने के लिए) एक सादे मूल्य सूची के बजाय मिलता है।

उसके बाद आप आसानी से वांछित प्रस्ताव प्राप्त कर सकते हैं:

for employee in employees:
    print(employee.eng_name)

या टेम्पलेट में:

{% for employee in employees %}

    <p>{{ employee.eng_name }}</p>

{% endfor %}

1

आप फ़िल्टर के साथ मानों_सूची का उपयोग कर सकते हैं;

active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)

अधिक जानकारी यहाँ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.