In [1]: import django; from django.db.models import Count; from bugrep.models import * In [2]: Alfa.objects.all().delete; Bravo.objects.all().delete; Charlie.objects.all().delete() In [3]: b = Bravo.objects.create() In [4]: c = Charlie.objects.create(bravo=b) In [5]: qsboth = Charlie.objects.select_related('alfa').annotate(Count('bravo__charlie')); qsboth Out[5]: [] In [6]: qsboth_rev = Charlie.objects.annotate(Count('bravo__charlie')).select_related('alfa'); qsboth_rev Out[6]: [] In [7]: qsselrel = Charlie.objects.select_related('alfa'); qsselrel Out[7]: [] In [8]: qsanno = Charlie.objects.annotate(Count('bravo__charlie')); qsanno Out[8]: [] In [9]: str(qsboth.query) == str(qsboth_rev.query) Out[9]: True In [10]: print(str(qsboth.query)) SELECT "bugrep_charlie"."id", "bugrep_charlie"."alfa_id", "bugrep_charlie"."bravo_id", COUNT(T4."id") AS "bravo__charlie__count", "bugrep_alfa"."id" FROM "bugrep_charlie" INNER JOIN "bugrep_alfa" ON ( "bugrep_charlie"."alfa_id" = "bugrep_alfa"."id" ) LEFT OUTER JOIN "bugrep_bravo" ON ( "bugrep_charlie"."bravo_id" = "bugrep_bravo"."id" ) LEFT OUTER JOIN "bugrep_charlie" T4 ON ( "bugrep_bravo"."id" = T4."bravo_id" ) GROUP BY "bugrep_charlie"."id", "bugrep_charlie"."alfa_id", "bugrep_charlie"."bravo_id", "bugrep_alfa"."id" In [11]: print(str(qsselrel.query)) SELECT "bugrep_charlie"."id", "bugrep_charlie"."alfa_id", "bugrep_charlie"."bravo_id", "bugrep_alfa"."id" FROM "bugrep_charlie" LEFT OUTER JOIN "bugrep_alfa" ON ( "bugrep_charlie"."alfa_id" = "bugrep_alfa"."id" ) In [12]: a = Alfa.objects.create() In [13]: Charlie.objects.update(alfa=a) Out[13]: 1 In [14]: qsboth = Charlie.objects.select_related('alfa').annotate(Count('bravo__charlie')); qsboth Out[14]: [] In [15]: qsboth_rev = Charlie.objects.annotate(Count('bravo__charlie')).select_related('alfa'); qsboth_rev Out[15]: [] In [16]: print(django.get_version()) 1.6b4