2009-03-30 5 views
22

Tenir compte:Python/Django: Création d'une liste plus simple de values_list()

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

Comment peut-on simplifiera davantage à:

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

Le but:

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. 

Répondre

68

Utilisez le flat=True construction du queryset django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

De l'exemple dans la documentation:

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

Cette solution retourne une liste d'entiers. Pour obtenir une liste de chaînes comme '['1', '2', '3']' comme demandé par l'OP, vous devez faire 'map (str, Entry.objects.values_list ('id', flat = True) .order_by ('id')) ' –

+0

cela fonctionne quand vous avez seulement une valeur selon la question de l'OP. Avec plusieurs valeurs, vous pouvez utiliser 'list (queryset.iterator())' – MrE

+0

puis-je obtenir plusieurs valeurs comme Entry.objects.values_list ('id', 'name', flat = True) mais plat = True est travailler pour une seule valeur, pas pour plusieurs. Comment surmonter cela? – javed

0

Vous pouvez utiliser une compréhension de la liste:

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

Quelque chose comme ça?

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

ceci est une re-implementati d'une API disponible dans django qui sera beaucoup plus lente que la requête SQL générée par django –

3

Vous devez faire ..pour obtenir cette sortie [ '1', '2', '3']

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

Questions connexes