2013-09-21 9 views
10

Sto cercando di ottimizzare le mie query, ma prefetch_related insiste per unire le tabelle e selezionare tutti i campi anche se ho solo bisogno dell'elenco di id dalla tabella delle relazioni.django prefetch_related id solo

queries

È possibile ignorare il 4 ° query. Non è correlato alla domanda.

Codice correlati:

class Contact(models.Model): 
    ... 
    Groups = models.ManyToManyField(ContactGroup, related_name='contacts') 
    ... 

queryset = Contact.objects.all().prefetch_related('Groups') 

risposta

14

Django 1.7 aggiunto Prefetch objects che consentono di personalizzare il set di query utilizzato durante prefetching. In questo caso, vorresti qualcosa del tipo:

queryset = Contact.objects.all().prefetch_related(
    Prefetch('Groups', queryset=Group.objects.all().only('id'))) 
+1

lol, ben giocato. Qui, prendi il tuo biscotto. :) – demux

+1

In Django 1.11 con Postgres, avevo bisogno di selezionare ulteriormente la chiave esterna dell'oggetto precaricato, altrimenti Django stava facendo una ricerca DB per ogni oggetto precaricato per selezionare la chiave esterna (che è peggio di nessuna prefetch). In questo esempio, la modifica sarebbe: 'queryset = Group.objects.all(). Only ('id', 'contact_id'))' – erikreed

+0

Molto triste che non funzioni con i tipi di contenuto – valignatev

Problemi correlati