2012-08-15 18 views

Respuesta

4

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).

3

.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).

+4

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

1

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.

Cuestiones relacionadas