Django में मूल्यों () में आइटम का नाम कैसे बदलें?


101

मैं djangoproject.com पर इस टिकट की तरह ही बहुत कुछ करना चाहता हूं , लेकिन कुछ एडिटोनल फॉर्मेटिंग के साथ। इस प्रश्न से

>>> MyModel.objects.values('cryptic_value_name')
[{'cryptic_value_name': 1}, {'cryptic_value_name': 2}]

मैं कुछ ऐसा प्राप्त करना चाहता हूं:

>>> MyModel.objects.values(renamed_value='cryptic_value_name')
[{'renamed_value': 1}, {'renamed_value': 2}]

क्या कोई अन्य, अधिक निर्मित रास्ता है या क्या मुझे इसे मैन्युअल रूप से करना है?

जवाबों:


72

यह थोड़ा हैकी है, लेकिन आप इस extraविधि का उपयोग कर सकते हैं :

MyModel.objects.extra(
  select={
    'renamed_value': 'cryptic_value_name'
  }
).values(
  'renamed_value'
)

यह मूल रूप से करता है SELECT cryptic_value_name AS renamed_value से SQL में है।

एक अन्य विकल्प, यदि आप हमेशा बदला हुआ संस्करण चाहते हैं, लेकिन db का गूढ़ नाम है, तो अपने क्षेत्र को नए नाम के साथ नाम दें, लेकिन db_columndb में मूल नाम का संदर्भ लें।


6
1.7 में स्पष्ट रूप से। * आप सीधे अलियास किए गए नामों को लिखने में सक्षम होंगे जैसा कि नामित तर्क हैं values()। स्रोत: code.djangoproject.com/ticket/16735
gregoltsov

19
-1 क्योंकि .values(supports__through_tables)और यह हैक नहीं है (संयोग से शायद सबसे स्पष्ट उपयोग मामले में ValuesQuerySetतानाशाह चाबियों का नाम बदलना चाहते हैं )
wim

1
क्या किसी को तालिकाओं के माध्यम से ऐसा करने का एक तरीका मिला है (? .Values ​​(support__through_tables))?
फ्रांस्वा कॉन्स्टेंट

12
दुर्भाग्य से, यह समाधान संबंधित नामों की तरह समर्थन नहीं करता है .values('foreignkeymodel__id', 'foreignkeymodel__name')
ऋषिदिन

13
Model.objects.annotate (my_alias = F ('some__long__name__to__alias'))। मान ('my_alias') टिकट से 16735.
यूजीन

188

से django>=1.8आप व्याख्या और एफ वस्तु का उपयोग कर सकते

from django.db.models import F

MyModel.objects.annotate(renamed_value=F('cryptic_value_name')).values('renamed_value')

इसके अलावा extra()से पदावनत किया जा रहा है Django डॉक्स:

यह एक पुराना API है जिसका उद्देश्य भविष्य में किसी बिंदु पर पदावनत करना है। इसका उपयोग केवल तभी करें जब आप अन्य क्वेरीसेट विधियों का उपयोग करके अपनी क्वेरी को व्यक्त नहीं कर सकते। यदि आपको इसका उपयोग करने की आवश्यकता है, तो कृपया अपने उपयोग के मामले के साथ QuerySet.extra कीवर्ड का उपयोग करके एक टिकट दर्ज करें (कृपया पहले मौजूदा टिकटों की सूची की जांच करें) ताकि हम अतिरिक्त हटाने की अनुमति देने के लिए QuerySet API को बढ़ा सकें ()। हम अब इस विधि के लिए बग्स को सुधार या ठीक नहीं कर रहे हैं।


3
यह उत्तर केवल काम पर है django>=1.8। क्वेरी अभिव्यक्तियाँ annotateसमुच्चय के अलावा अन्य भावों को स्वीकार करने में सक्षम हैं । संदर्भ: docs.djangoproject.com/en/1.9/releases/1.8/…
Yeo

3
यह काम करता है, लेकिन मूल प्रश्न में सिंटैक्स प्रस्तावित नहीं है बस इतना अच्छा ? MyModel.objects.values(renamed_value='cryptic_value_name')
१५:०२ पर

11
MyModel.objects.values(renamed_value=models.F('cryptic_value_name'))काम करता है
jarcoal

1
यह जवाब काम करता है लेकिन बेमानी है। कीवर्ड तर्क आपकी ओर values()से पारित किए गए हैं annotate()(देखें docs.djangoproject.com/en/2.2/ref/models/querysets/… )। इसका उत्तर MyModel.objects.values(renamed_value=F('cryptic_value_name'))सरल और अधिक स्पष्ट है, IMO।
टोबिया.मिनी फैकल्टी

76

किसी अन्य प्रबंधक विधि का उपयोग किए बिना (पर परीक्षण v3.0.4):

from django.db.models import F

MyModel.objects.values(renamed_value=F('cryptic_value_name'))

Django डॉक्स से उद्धरण :

एक एफ () ऑब्जेक्ट एक मॉडल फ़ील्ड या एनोटेट कॉलम के मूल्य का प्रतिनिधित्व करता है। यह वास्तव में उन्हें पायथन मेमोरी में डेटाबेस से बाहर खींचने के लिए बिना मॉडल फ़ील्ड मानों को संदर्भित करना और उनका उपयोग करके डेटाबेस संचालन करना संभव बनाता है।


5
एक से अधिक मूल्य के लिए आप उपयोग कर सकते हैं:MyModel.objects.values(renamed_value=F('cryptic_value_name'),renamed_value2=F('cryptic_value_name2'))
अल्फा

1
लेकिन क्या होगा अगर आप एक मूल्य को बदलना चाहते हैं और दूसरे को रखना चाहते हैं? एनोटेट के साथ यह संभव है: inv.annotate(name=F('stock__name')).values('name', "price")लेकिन मैं यह नहीं देखता कि इस मामले में यह तरीका कैसे काम करना चाहिए। inv.values(name=F("stock__name"), price=F("price"))-> एनोटेशन 'मूल्य' मॉडल पर एक क्षेत्र के साथ संघर्ष करता है
माल्ट

1
@ मुझे लगता है कि इसे जटिल करने की आवश्यकता नहीं है। बस कोशिश करो inv.values('price', name=F("stock__name"))। अजगर में आप केवल अनाम लोगों के नाम वाली दलीलें रख सकते हैं।
अर्पित सिंह

0

मैं django 1.11.6 के साथ काम कर रहा हूं

(और कुंजी: मूल्य जोड़ी स्वीकृत उत्तर के विपरीत है)

इस तरह से मैं इसे अपनी परियोजना के लिए काम कर रहा हूं

def json(university):
    address = UniversityAddress.objects.filter(university=university)
    address = address.extra(select={'city__state__country__name': 'country', 'city__state__name': 'state', 'city__name': 'city'})
    address = address.values('country', 'state', "city", 'street', "postal_code").get()
    return address

ध्यान दें कि सम-विषम वस्तुओं को जोड़ना। फाइटर ()। अतिरिक्त ()। मान) () ऊपर जैसा है।


आप देख सकते हैं कि .extra(select={cryptic_value:ranamed_value})विपरीत कुंजी है: स्वीकृत उत्तर की तुलना में मूल्य
सुदीप भट्टाराई

-6

यदि आप मोड के कुछ क्षेत्रों का नाम बदलना चाहते हैं तो यह सरल से अधिक है।

प्रयत्न

projects = Project.objects.filter()
projects = [{'id': p.id, 'name': '%s (ID:%s)' % (p.department, p.id)} for p in projects]

यहां मेरे पास nameतालिका में एक फ़ील्ड नहीं है , लेकिन मैं इसे थोड़ा सा ट्विक करने के बाद प्राप्त कर सकता हूं।


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