Сейчас если есть агрегация добавляются в group_by все поля из select, хотя в коде описано что этот хак совместим, но неет.
Прийдется перекрывать стандартную функцию группировки:
_get_group_by = SQLCompiler.get_group_by
def custom_group_by(self, select, order_by):
if self.query.group_by is True or not self.query.group_by:
return _get_group_by(self, select, order_by)
expressions = []
if self.query.group_by is not True:
for expr in self.query.group_by:
if not hasattr(expr, 'as_sql'):
expressions.append(self.query.resolve_ref(expr))
else:
expressions.append(expr)
if len(expressions):
having = self.query.having.get_group_by_cols()
for expr in having:
expressions.append(expr)
result = []
seen = set()
expressions = self.collapse_group_by(expressions, having)
for expr in expressions:
sql, params = self.compile(expr)
if (sql, tuple(params)) not in seen:
result.append((sql, params))
seen.add((sql, tuple(params)))
if result:
return seen
SQLCompiler.get_group_by = custom_group_by
# Потом использовать как обычно:
post_set = Active.objects.filter(rubrica__pk=1, type__pk=1).order_by('user', '-pub_date')
post_set.query.group_by = ['user_id']
print post_set.query
Как вариант расширить вложенным запросом, но это может сказаться на производительности.
что-то подобное:
users = Active.objects.values('user_id').distinct()
post_set = Active.objects.filter(rubrica__pk=1, type__pk=1, user__in=users)
будет один запрос, но появится вложенный select