El método .values() de Django ofrece la funcionalidad de seleccionar y devolver solo campos específicos al ejecutar un QuerySet. Al usar este método, el resultado se devuelve en forma de lista de diccionarios y solo se pueden obtener los campos específicos en lugar de todos los campos del modelo.

📌 Características principales:

  • Un QuerySet típico (Model.objects.all()) devuelve una lista de objetos (instancias de modelo), mientras que
  • al usar .values() se devuelve una lista de diccionarios.

🛠 1. Uso básico

from myapp.models import Post

# QuerySet existente (devuelve instancias del modelo que incluyen todos los campos)
posts = Post.objects.all()  
print(posts)  
# , ]>

# Usando .values() (solo obteniendo los campos title y author)
posts = Post.objects.values('title', 'author')  
print(posts)  
# 

📌 Diferencias:

  • Post.objects.all()devuelve una lista de instancias del modelo Post
  • Post.objects.values('title', 'author')devuelve una lista de diccionarios

🛠 2. Optimización de rendimiento de .values()

Al usar .values(), se puede evitar la carga innecesaria de campos, lo que mejora el rendimiento de las consultas. Es decir, reducimos la carga en la base de datos al obtener solo los campos necesarios.

# Obtener todos los objetos del modelo (ineficiente)
Post.objects.all()

# Obtener solo los campos necesarios (eficiente)
Post.objects.values('title', 'author')

🛠 3. Diferencia entre .values() y .values_list()

.values() → devuelve una lista de diccionarios

Post.objects.values('id', 'title')
# <QuerySet [{'id': 1, 'title': 'Primer artículo'}, {'id': 2, 'title': 'Segundo artículo'}]>

.values_list() → devuelve una lista de tuplas

Post.objects.values_list('id', 'title')
# <QuerySet [(1, 'Primer artículo'), (2, 'Segundo artículo')]>

🛠 4. Usar .values() junto con annotate()

Al usar annotate() junto con .values(), se puede obtener datos agregados en forma de diccionario.

from django.db.models import Count
from myapp.models import Post, Comment

# Obtener el número de comentarios por cada publicación(post)
Post.objects.values('title').annotate(comment_count=Count('comments'))

🛠 5. Filtrando usando .values() (junto con distinct())

Ejemplo: Obtener los títulos de todas las publicaciones escritas por un author específico, pero eliminando duplicados:

Post.objects.values('title').filter(author=1).distinct()

📌 Conclusión

  • .values() transforma el QuerySet en una lista de diccionarios, obteniendo solo los campos específicos.
  • ✅ Posibilidad de optimizar el rendimiento de consultas excluyendo campos innecesarios.
  • ✅ En comparación con .values_list(), .values() devuelve diccionarios, mientras que .values_list() devuelve tuplas.
  • ✅ Se puede usar junto con .annotate() para obtener datos agregados en forma de diccionario.
  • ✅ Posibilidad de eliminar duplicados usando .distinct().

💡 .values() es una poderosa herramienta para optimizar el rendimiento al reducir campos innecesarios durante la recuperación de datos. 🚀 Es muy útil cuando necesitas obtener datos en forma de diccionario en lugar de instancias del modelo según el propósito! 😊

Concepto del método .values() de Django QuerySet

¡Ah! Como algunos de ustedes ya se habrán dado cuenta al ver los resultados de los ejemplos anteriores, las listas de diccionarios que se devuelven a través de .value() y .value_list() siguen siendo QuerySets. (Dado que se evalúan de manera diferida, si necesitan evaluación inmediata, ¡por favor, envuélvanlas en list()!)