Django: ¿cómo selecciono una columna en particular de un modelo?

Olípeé alrededor de SO y no pude encontrar esto, pero estoy seguro de que está aquí en alguna parte. ¡Disculpas por esta posible publicación doble!

Si tengo este código:

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

y digamos que Story tiene, um, un campo de "descripción", y yo a unos quiero ese campo de descripción, no es necesario que la base de datos envíe nada más con mi resultado, ¿cómo limito la consulta a a unos eso?

Es decir, ¿cómo 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)

preguntado el 22 de mayo de 12 a las 16:05

3 Respuestas

Utiliza values() or values_list().

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

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

Si utiliza values_list(), terminarás con una lista de tuplas

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

O si solo obtiene un valor como en este caso, puede usar el flat=True kwarg con values_list para obtener una lista simple de valores

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

Consulte las documentación oficial

respondido 07 nov., 20:14

Correcto: return Story.objects.filter(user=request.user.id).order_by('-create_date').values('description') - Furbeenador

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

¿Qué pasa si quiero obtener los datos de un campo jsonb tal como están? - Siempre soleado

Use el único método. Por favor lea la documentación

contestado el 22 de mayo de 12 a las 16:05

Esto en realidad envía de vuelta pk también - OK M

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

Como dice la documentación, si su conjunto de consultas generará solo un objeto, se recomienda que use get() en lugar de filter. Por el nombre que ha dado, asumiría que user_id es distinto para cada usuario. EDIT1: acabo de recibir un aviso de la cláusula orderby. Por lo tanto, sugeriría usar este código si el ID de usuario es distinto o con pk.

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

Respondido 18 ago 14, 21:08

La pregunta es sobre cómo seleccionar valores de columna en particular de una tabla dada usando Django ORM. - user3785966

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.