Cuál es la diferencia entre usar:diferencia entre los valores de() y sólo()
Blabla.objects.values('field1', 'field2', 'field3')
y
Blabla.objects.only('field1', 'field2', 'field3')
Cuál es la diferencia entre usar:diferencia entre los valores de() y sólo()
Blabla.objects.values('field1', 'field2', 'field3')
y
Blabla.objects.only('field1', 'field2', 'field3')
Suponiendo Blabla
tiene los campos en su pregunta, así como field4
,
Blabla.objects.only('field1', 'field2', 'field3')[0].field4
devolverá el valor de ese objeto de field4
(con una nueva consulta de base de datos para recuperar esa información), mientras que
Blabla.objects.values('field1', 'field2', 'field3')[0].field4
dará
AttributeError: 'dict' object has no attribute 'field4'
Esto es porque .values()
devuelve un ValuesQuerySet
basado en el QuerySet
existente, que es esencialmente una lista de dicts (en el sentido de que un QuerySet
normal es una lista de objetos Blabla
).
.values()
da que "menos de un modelo"; los elementos que devuelve están más cerca de los diccionarios que los modelos completos, lo que significa que no obtiene los atributos del modelo, pero tampoco tiene que inicializar los modelos completos.
.only()
restringe la lista de campos en el SQL a los campos específicos que le interesan, pero aún inicializa un modelo completo; difiere la carga de los otros campos hasta que accedas a ellos (si es que lo hace).
values()
devuelve un ValueQuerySet
especial que, al repetirse, devuelve diccionarios que representan el modelo. No devuelve objetos modelo.
only()
es una forma de restringir las columnas devueltas, y asegurar que sólo esas columnas se devuelven inmediatamente - por lo que se refiere a veces como el opuesto de defer()
Es el equivalente a decir SELECT foo, bar, zoo FROM
en lugar de la normal SELECT [all columns] FROM
. Devolverá un QuerySet
que puede encadenarse aún más.
Los elementos que devuelve no están * cerca de * dicts, they [* are * dicts] (https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py # L946) – supervacuo