2010-03-17 10 views
61

मैं Django के ORM के आस-पास अपना सिर प्राप्त करने में संघर्ष कर रहा हूं।तालिका फ़ील्ड से अलग मान चुनें

SELECT DISTINCT myfieldname FROM mytable 

(या वैकल्पिक रूप से)

SELECT myfieldname FROM mytable GROUP BY myfieldname 

मैं: मुझे क्या करना चाहते हैं निम्न में से एक के बराबर मेरी मेज पर एक क्षेत्र के भीतर विशिष्ट मानों की एक सूची प्राप्त .... है डी कम से कम कच्चे एसक्यूएल का उपयोग करने से पहले Django रास्ता करना पसंद है। उदाहरण के लिए, एक मेज के साथ:

आईडी, सड़क, शहर

1, मुख्य सड़क, हल

2, अन्य स्ट्रीट, हल

3, Bibble मार्ग, लीसेस्टर

4, एक और रास्ता, लीसेस्टर

5, हाई स्ट्रीट, Londidium

मैं प्राप्त करना चाहते हैं:

हल, लीसेस्टर, Londidium।

उत्तर

128

मान लें कि आपका मॉडल 'दुकान'

class Shop(models.Model): 
    street = models.CharField(max_length=150) 
    city = models.CharField(max_length=150) 

    # some of your models may have explicit ordering 
    class Meta: 
     ordering = ('city') 

जब से तुम Meta वर्ग ordering विशेषता निर्धारित हो सकता है, आप जब distinct() का उपयोग कर पैरामीटर के बिना order_by() उपयोग कर सकते हैं किसी भी आदेश को अनुमति देना। order_by()

तहत दस्तावेज़ देखें क्या आपके पास कोई आदेश देने के एक सवाल के लागू होने के लिए नहीं करना चाहते हैं, नहीं भी डिफ़ॉल्ट अनुक्रम,() order_by फोन नहीं मानकों के साथ।

और टिप्पणी जहां यह आदेश देने के साथ distinct() उपयोग करने के साथ मुद्दों पर चर्चा में distinct()

अपने डीबी क्वेरी करने के लिए, तुम सिर्फ कॉल करनी होगी:

models.Shop.objects.order_by().values('city').distinct() # returns a dictionary 

या

models.Shop.objects.order_by().values_list('city').distinct() # returns a list of tuples. 

तुम भी values_list को flat=True जोड़ सकते हैं एक फ्लैट सूची है।

यह भी देखें: Get distinct values of Queryset by field

+25

वास्तव में है कि काम करता है। तथापि! मैं इसे अपने सभी मॉडलों पर काम नहीं कर सका। दुर्भाग्य से, यह कुछ पर काम किया लेकिन दूसरों को नहीं। उन लोगों के लिए जिनके पास मेटा ऑर्डरिंग है, यह काम नहीं करता है। तो, आपको पहले क्वेरीसेट पर ऑर्डर करना होगा। मॉडल .Shop.objects.order_by()। मान ('शहर')। विशिष्ट() – alj

+1

यह ध्यान रखना महत्वपूर्ण है कि 'value_list' वास्तव में एक सूची नहीं लौटाता है। यह एक क्वेरीसेट की तरह कुछ देता है।मुझे हमेशा मूल्य_सूची कॉल के चारों ओर सूची() का उपयोग करना उपयोगी लगता है। – dheerosaur

+8

'values_list' ValuesListQuerySet देता है जो एक पुनरावर्तक है। सूची में कास्टिंग आसान हो सकता है, लेकिन प्रदर्शन के दौरान भी हमला कर सकते हैं जब सभी पंक्तियों का मूल्यांकन एक बार में किया जाना चाहिए, खासकर बड़े डेटा सेट के साथ। –

संबंधित मुद्दे