Ну смотрите..
Есть такой код (предварительно идет просто фильтрация):
markers_and_clusters = markers.annotate(lvl_div=(Func((F('levels') / level_for_query), function='ROUND'))).\
values('lvl_div').annotate(count=Count('lvl_div'),
x=Avg(Func(F('point'), function='ST_X')),
y=Avg(Func(F('point'), function='ST_Y')),
id=Min('id')
)
markers_ = markers_and_clusters.filter(count=1)
Этот код формирует запрос вида (некоторые фильтры WHERE опустил):
SELECT ROUND(("marker"."levels" / 10000000000000)) AS "lvl_div",
MIN("marker"."id") AS "id",
AVG(ST_Y("marker"."point")) AS "y",
COUNT(ROUND(("marker"."levels" / 10000000000000))) AS "count",
AVG(ST_X("marker"."point")) AS "x"
FROM "marker"
INNER JOIN "my_user" ON ( "marker"."owner_id" = "my_user"."id" )
WHERE (
"my_user"."is_active" = true
AND "my_user"."is_blocked" = false
AND "my_user"."is_deleted" = false
AND "marker"."is_deleted" = false
AND "marker"."is_active" = true
AND NOT ("marker"."owner_id" IN (
SELECT U2."user_source_id" AS Col1
FROM "blocked_user" U2
WHERE U2."blocked_user_target_id" = 2))
AND ("marker"."max_age" >= 22 OR "marker"."max_age" IS NULL)
AND ("marker"."min_age" <= 22 OR "marker"."min_age" IS NULL)
AND ("marker"."allowed_gender" = 1 OR "marker"."allowed_gender" = 2))
GROUP BY ROUND(("marker"."levels" / 10000000000000))
HAVING COUNT(ROUND(("marker"."levels" / 10000000000000))) = 1;
Этот запрос выдает:
lvl_div; id; y; count; x
431442211; 60527; 50.4665817458564; 1; 42.3044882282827
433221113; 59633; 53.875796739733; 1; 34.1714830996864
434333242; 60457; 63.5846316116864; 1; 50.3748939935136
432323443; 60090; 50.2688890111897; 1; 60.7999305558882
...
Как заставить его выводить также другие поля из таблицы marker и my_user? Если полей нет, то выводить Null