È possibile ottenere abbastanza vicino in questo modo:
qs = A.objects.prefetch_related(Prefetch(
'related',
queryset=A.objects.only('pk'),
to_attr='related_insts')).in_bulk(my_list_of_pks)
questo darà una mappatura da PKS dell'oggetto corrente all'istanza stessa, in modo da poter scorrere come segue:
for pk, inst in qs.iteritems():
related_ids = (related.pk for related in inst.related_insts)
o dato un esempio, si può fare una ricerca veloce in questo modo:
related_ids = (related.pk for related in qs[instance.pk]).
Questo metodo associa gli id di istanza agli ID correlati (indirettamente) poiché si richiede specificamente un dizionario. Se non si sta facendo le ricerche, si consiglia il seguente invece:
qs = A.objects.prefetch_related(Prefetch(
'related',
queryset=A.objects.only('pk'),
to_attr='related_insts')).filter(pk__in=my_list_of_pks)
for inst in qs:
related_ids = (related.pk for related in inst.related_insts)
si può prendere atto della uso di only
a tirare solo le PKS dal db. C'è un open ticket per consentire l'uso di values
e (presumo) values_list
nelle query di Prefetch. Questo ti permetterebbe di fare quanto segue.
qs = A.objects.prefetch_related(Prefetch(
'related',
queryset=A.objects.values_list('pk', flat=True),
to_attr='related_ids')).filter(pk__in=my_list_of_pks)
for inst in qs:
related_ids = inst.related_ids
Si potrebbe naturalmente ottimizzare ulteriormente, ad esempio utilizzando qs.only('related_insts')
sul set di query primario, ma assicurarsi che non si sta facendo nulla con questi instances-- sono essenzialmente solo contenitori costosi per tenere il vostro related_ids.
Credo che questo sia il migliore disponibile per ora (senza query personalizzate). Per raggiungere esattamente quello che vuoi, sono necessarie due cose:
- La funzione di cui sopra è implementata
values_list
è fatto per lavorare con Prefetch to_attr
, come invece accade per le annotazioni.
Con queste due cose a posto (e continuando l'esempio precedente) si potrebbe fare quanto segue per ottenere esattamente quello che avete richiesto:
d = qs.values_list('related_ids', flat=True).in_bulk()
for pk, related_pks in d:
print 'Containing Objects %s' % pk
print 'Related objects %s' % related_pks
# And lookups
print 'Object %d has related objects %s' % (20, d[20])
ho lasciato fuori alcuni dettagli spiegare le cose, ma è dovrebbe essere abbastanza chiaro dalla documentazione. Se hai bisogno di chiarimenti, non esitare!
Hai mai trovato una soluzione a questo? – cazgp