2009-03-30 9 views
22

पर विचार करें:पायथन/Django: values_list से एक सरल सूची बनाना()

['1', '2', '3'] 

उद्देश्य:

class ActivityForm(forms.ModelForm): 
    def __init__(self, *args, **kwargs): 
     super(ActivityForm, self).__init__(*args, **kwargs) 
     if self.initial['job_record']: 
      jr = JobRecord.objects.get(pk=self.initial['job_record']) 

      # Operators 
      self.fields['operators'].queryset = jr.operators 

      # select all operators by default 
      self.initial['operators'] = jr.operators.values_list('id') # refined as above. 

उत्तर

68

उपयोग Django क्वेरीसमूह के flat=True निर्माण: डॉक्स में https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

उदाहरण से:

>>> Entry.objects.values_list('id', flat=True).order_by('id') 
[1, 2, 3, ...] 
+6

से बहुत धीमी होगी, यह समाधान पूर्णांक की एक सूची देता है। ओपी के रूप में पूछे जाने वाले '[' 1 ',' 2 ',' 3 '] जैसे तारों की सूची प्राप्त करने के लिए, आपको' नक्शा (str, Entry.objects.values_list ('id', flat = True) करना होगा .order_by ('id')) ' –

+0

यह तब काम करता है जब आपके पास ओपी के प्रश्न के अनुसार केवल एक मान होता है। कई मानों के साथ, आप 'सूची (queryset.iterator()) ' – MrE

+0

का उपयोग कर सकते हैं, मुझे Entry.objects.values_list (' id ',' name ', flat = True) पर एकाधिक मान मिल सकते हैं लेकिन फ्लैट = सही है एकाधिक एकल के लिए केवल एक मान के लिए काम नहीं कर रहा है। इसे कैसे दूर करें? – javed

0

आप कर सकते हैं

>>>jr.operators.values_list('id') 
[(1,), (2,), (3,)] 

कैसे एक के लिए आगे सरल है एक सूची समझ का उपयोग करें:

 
    >>> mylist = [(1,), (2,), (3,)] 
    >>> [str(x[0]) for x in mylist] 
    ['1', '2', '3'] 
0

ऐसा कुछ?

x = [(1,), (2,), (3,)] 
y = [str(i[0]) for i in x] 
['1', '2', '3'] 
+1

एक फिर से implementati है django में उपलब्ध एक एपीआई पर जो django की जेनरेट की गई SQL क्वेरी –

3

आप ..to इस उत्पादन [ '1' प्राप्त करने की जरूरत है, '2', '3']

map(str, Entry.objects.values_list('id', flat=True).order_by('id'))

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