Qual è la differenza tra l'utilizzo di:differenza tra i valori() e solo()
Blabla.objects.values('field1', 'field2', 'field3')
e
Blabla.objects.only('field1', 'field2', 'field3')
Qual è la differenza tra l'utilizzo di:differenza tra i valori() e solo()
Blabla.objects.values('field1', 'field2', 'field3')
e
Blabla.objects.only('field1', 'field2', 'field3')
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
).
.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).
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.
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