Django: ¿cómo selecciono una columna en particular de un modelo?
Frecuentes
Visto 51,212 veces
35
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)
3 Respuestas
57
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
4
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
0
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 django or haz tu propia pregunta.
Posible duplicado de ¿Cómo limitar las columnas devueltas por la consulta de Django? - Ciro Santilli 新疆再教育营六四事件法轮功郝海东