2012-05-22 23 views
25

He olfateado SO y no pude encontrar esto, pero estoy seguro de que está aquí en alguna parte. Disculpas por este potencial doble post!Django: ¿cómo selecciono una columna particular de un modelo?

Si tengo este código:

return Story.objects.filter(user=request.user.id).order_by('-create_date') 

y decir historia tiene, um, un campo "Descripción", y yo simplemente quiere que el campo descripción, sin necesidad de que el PP para enviar cualquier otra cosa de vuelta con mi resultado, ¿cómo limito la consulta a solo eso?

Eso es, como genero este SQL:

select description from story where user_id = x order by create_date desc 

(donde x es el valor request.user.id, por supuesto)

+0

duplicado posible de [Cómo limitar columnas devueltas por la consulta de Django?] (Http://stackoverflow.com/questions/2448978/how-to-limit-columns-returned-by-django-query) –

Respuesta

37

Uso values() o values_list().

Si utiliza values(), Usted va a terminar con una lista de diccionarios (técnicamente un ValuesQuerySet)

instance = MyModel.objects.values('description')[0] 
description = instance['description'] 

Si utiliza values_list(), que va a terminar con una lista de tuplas

instance = MyModel.objects.values_list('description')[0] 
description = instance[0] 

O si sólo está recibiendo un valor como en este caso, se puede utilizar el kwarg flat=True con values_list para obtener una lista simple de los valores

description = MyModel.objects.values_list('description', flat=True)[0] 
+5

Correcto: 'return Story.objects.filter (user = request.user.id) .order_by ('- create_date'). Values ​​('description')' – Furbeenator

+3

@bharal muchas veces encuentro que una lista de valores es más útil que una lista de tuplas Puede pasar 'flat = True' a' values_list' para obtener una lista de valores – dm03514

+0

gracias a todos, esto es exactamente lo que necesitaba – bharal

3

Utilice only method. Lea la documentación

+0

Esto realmente devuelve 'pk' también – okm

+1

um, de la documentación que acabo de leer: The defer() método (y su primo, solo(), a continuación) son solo para casos de uso avanzados. Proporcionan una optimización para cuando haya analizado sus consultas de cerca y entienda exactamente qué información necesita y ha medido que la diferencia entre devolver los campos que necesita y el conjunto completo de campos para el modelo será significativa. – bharal

1

Como dice el documento si el conjunto de su consulta va a producir solo un objeto, se recomienda que use get() en lugar de filter. Por el nombre que me ha dado, supondría que user_id es distinto para cada usuario. EDIT1: Acabo de tomar nota de la cláusula orderby. Así que sugeriría usar este código si el user_id es distinto o con pk.

description = story.objects.filter('description').get(user_id=x) 
Cuestiones relacionadas