2009-03-30 7 views
22

considerar:Python/Django: Creación de una lista simple de values_list()

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

¿Cómo se puede simplificar aún más a:

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

El propósito:

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. 

Respuesta

68

Uso del flat=True constructo de la queryset Django: https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

A partir del ejemplo en la documentación:

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

Esta solución devuelve una lista de enteros. Para obtener una lista de cadenas como '['1', '2', '3']' como se solicitó OP, debe hacer 'map (str, Entry.objects.values_list ('id', flat = True) .order_by ('id')) ' –

+0

esto funciona cuando solo tiene un valor según la pregunta del OP. Con valores múltiples, puede usar 'list (queryset.iterator())' – MrE

+0

¿puedo obtener múltiples valores como Entry.objects.values_list ('id', 'name', flat = True) pero plano = Verdadero es trabajando solo por un solo valor, no por múltiples. ¿Cómo superar esto? – javed

0

Puede use una lista de comprensión:

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

¿Algo como esto?

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

este es un re-implementati de una API disponible en django que será mucho más lenta que la consulta SQL generada por django –

3

Es necesario hacer ..para obtener esta salida [ '1', '2', '3']

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

Cuestiones relacionadas