2013-09-21 6 views
10

Ich versuche, meine Abfragen zu optimieren, prefetch_related besteht jedoch darauf, die Tabellen zu verbinden und alle Felder auszuwählen, obwohl ich nur die Liste der IDs aus der Relationstabelle benötige.django prefetch_related id only

queries

können Sie die 4. Abfrage ignorieren. Es hängt nicht mit der Frage zusammen.

Verwandte Code:

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

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

Antwort

14

Django 1.7 hinzugefügt Prefetch objects Ihnen die queryset lassen anpassen verwendet, wenn Prefetching. In diesem Fall möchten Sie etwas wie:

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

lol, gut gespielt. Hier haben Sie Ihren Keks. :) – demux

+1

In Django 1.11 mit Postgres musste ich zusätzlich den Fremdschlüssel des Prefetch-Objekts auswählen - sonst machte Django eine DB-Suche für jedes Prefetch-Objekt, um den Fremdschlüssel auszuwählen (was schlimmer ist als gar kein Prefetch). In diesem Beispiel wäre die Änderung: 'querieset = Group.objects.all(). Only ('id', 'contact_id'))' – erikreed

+0

Sehr schade, dass es nicht mit Inhaltstypen funktioniert – valignatev