2012-08-15 14 views

risposta

4

Supponendo Blabla ha i campi nella sua domanda, così come field4,

Blabla.objects.only('field1', 'field2', 'field3')[0].field4 

restituirà il valore di tale oggetto di field4 (con una nuova query di database per recuperare queste informazioni), mentre

Blabla.objects.values('field1', 'field2', 'field3')[0].field4 

darà

AttributeError: 'dict' object has no attribute 'field4' 

Questo perché .values() restituisce un ValuesQuerySet in base allo QuerySet esistente, che è essenzialmente un elenco di dict (nel senso che un normale QuerySet è un elenco di oggetti Blabla).

3

.values() ti dà "meno di un modello"; gli oggetti restituiti sono più vicini ai dizionari rispetto ai modelli completi, il che significa che non si ottengono gli attributi del modello, ma non è necessario inizializzare i modelli completi.

.only() limita l'elenco di campi nell'SQL a campi specifici che ti interessano, ma inizializza ancora un modello completo; rimuove il caricamento degli altri campi finché non li accedi (se non del tutto).

+4

Gli articoli restituiti non sono * vicino a * dicts, loro [* sono * dicts] (https://github.com/django/django/blob/stable/1.4.x/django/db/models/ query.py # L946) – supervacuo

1

values() restituisce uno speciale ValueQuerySet - che quando viene ripetuto i dizionari rappresenta il modello. Non restituisce oggetti modello.

only() è un modo di limitare le colonne restituite, e assicurando che solo le colonne vengono restituite immediatamente - quali è perciò viene spesso indicato come il contrario di defer() È equivale a dire SELECT foo, bar, zoo FROM anziché il normale SELECT [all columns] FROM. Restituirà un QuerySet che può essere ulteriormente incatenato.