2012-02-07 14 views
33

Ho provato prefetch_related() in django 1.4 dal trunk e non riesco a far precedere la ricerca inversa.Django: prefetch_related() segue la ricerca inversa delle relazioni?

I miei modelli semplificati (ogni libro ha molti prezzi):

class Book(models.Model): 
    # some fields 

class Price(models.Model): 
    book = models.ForeignKey(Book) 
interrogazione

mio di vista:

books = Book.objects.prefetch_related('price') 

Poi, ho ricevuto il messaggio AttributeError:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related() 

Come fallo funzionare? Grazie.

+14

libri = Book.objects.prefetch_related ('price_set') – Acute

+2

@Jonathanz: Si dovrebbe mettere il tuo commento come la risposta accettata cioè 'prefetch_related ('price_set')' – Medorator

risposta

61

Definire un nome correlato:

class Price(models.Model): 
    book = models.ForeignKey(Book, related_name='prices') 

e poi usarlo:

books = Book.objects.prefetch_related('prices') 
+31

La tua risposta mi ricorda la FOO_set così la correzione può anche essere .prefetch_related ('price_set'). A proposito, grazie mille – Tianissimo

+1

Non riesco a riprodurlo nella shell. Ancora fa domande separate, mi aspettavo dei join. – pdvyas

+0

Ciao! Ho anche provato questo, ma come @pdvyas ha detto, ci sono query separate. Questo non fa un join ... – Anton

0

quando non si è definito un related_name per la relazione, la relazione inversa ha _set aggiunto. Questo è il caso quando si accede alla relazione inversa da un oggetto (es some_book.price_set.all()), ma funziona anche su prefetch_related:

books = Book.objects.prefetch_related('price_set') 

noti che questo sembra diverso da filtro, che fa accettare il nome dell'altro modello senza _set (ad es. Books.objects.filter(price__currency='EUR')).

Quanto sopra è stato testato con 1.11.8 (non su questo codice specifico, ma sul mio codice simile).

In alternativa, è possibile aggiungere un related_name, come illustrato da Jan Pöschko sopra.

Problemi correlati