2012-12-11 9 views
21

To z pewnością będzie duplikatem, ale nie mogę znaleźć żadnych innych. Próbuję uzyskać listę zdjęć, które mają skargi. Nie mogę po prostu otrzymywać skarg i zajmować się powiązanymi zdjęciami - potrzebuję zestawu zapytań o zdjęcia.Filtrowanie obiektów Django, gdzie istnieje powiązany obiekt

To powinno działać, ale nie wydaje się słuszne:

Photo.objects.filter(complaint__id__gte=0) 

To nie wydaje się najbardziej efektywny sposób:

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

Czy istnieje lepszy sposób?

Odpowiedz

47

jak o ...

Photo.objects.filter(complaint__isnull=False)

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

+0

Prefekt, dziękuję! – Jake

+13

Konieczne może być również .distinct() na końcu, aby powielać to samo co adnotacja. Przynajmniej ja. – Christoffer

+3

@Christoffer, uratowałeś mi życie, dzięki. Jest to śmiertelny problem, więc chcę napisać komentarz i poprawić nacisk. –

4

Nie jestem pewien, co jest najlepsze, ale to działa tak samo.

Photo.objects.exclude(complaint=None)

Generated zapytań SQL nie jest tu taka sama, jak w przypadku z .filter(complaint__isnull=False), ale sens jest identyczna.

+1

To jest lepsze niż zaakceptowana odpowiedź, ponieważ nie wymaga wywołania '.distinct()' do pracy z relacjami wielowartościowymi. – Dan

Powiązane problemy