2012-12-11 12 views
21

Questa è destinata ad essere una domanda duplicata, ma non riesco a trovarne altri. Sto cercando di ottenere un elenco di foto che presentano reclami. Non posso semplicemente lamentarmi e trattare le foto correlate: ho bisogno di un queryset di foto.Filtro Oggetti Django in cui esiste un oggetto correlato

Questo dovrebbe funzionare, ma non mi sembra giusto:

Photo.objects.filter(complaint__id__gte=0) 

Questo non sembra il modo più efficiente:

Photo.objects.annotate(Count('complaint')).exclude(complaint__count=0) 

C'è un modo migliore?

risposta

47

come su ...

Photo.objects.filter(complaint__isnull=False)

da https://docs.djangoproject.com/en/dev/topics/db/queries/

+0

Prefetto, grazie! – Jake

+13

Potrebbe anche essere necessario un .distinct() alla fine per replicare lo stesso come fa un'annotazione. Almeno l'ho fatto. – Christoffer

+3

@Christoffer mi hai salvato la vita, grazie. È un problema mortale, quindi voglio scrivere un commento e migliorare l'enfasi. –

4

io non sono sicuro di quello che è il migliore, ma che funziona pure.

Photo.objects.exclude(complaint=None)

generata query SQL qui non è la stessa come nel caso con .filter(complaint__isnull=False), ma senso è identico.

+1

Questo è migliore della risposta accettata, perché non richiede una chiamata '.distinct()' per lavorare con relazioni multivalore. – Dan

Problemi correlati