Как сгруппировать по в запросе для Django admin serach?
У меня есть модель под названием Task. Пользователь должен найти определенный поиск в админке django. Поэтому я реализую метод:
def get_search_results(self, request, queryset, search_term):
in class TaskAdmin(admin.ModelAdmin):
.
Я определяю queryset сложным способом. Но это работает. Теперь у меня есть замечательный набор queryset, который приводит к почти идеальному SQL-запросу. Не хватает только одной вещи. Я бы хотел добавить GROUP BY в конце. Но как это сделать? Я пробовал несколько вариантов:
Начальная точка:
[...]
queryset = self.model.objects.filter(joinedQ)
Django aggregation:
.values.aggregate() обычно приводит к группировке по, но я не могу использовать .values для этого запроса, потому что django admin не ожидает dict в качестве результата. См: Группировать по дням в django admin?
используя скрытый атрибут group_by запроса:
queryset.query.group_by = ["product"]
queryset = QuerySet(query=queryset.query, model=Task)
Не работает. Результирующий запрос имеет все столбцы в group by, а не только столбец product, как я указал. Таким образом, он ничего не группирует.
Запрос в строку и затем вручную добавить GROUP BY
string_query = str(queryset.query)
string_query += 'GROUP BY "main_task"."product", "main_task"."version"'
queryset = Task.objects.raw(string_query)
В результате получается правильный запрос, который находит правильные результаты, но я получаю исключение: AttributeError: 'RawQuery' object has no attribute 'order_by'
используя .distinct("product")
Работает, но только в бэкендах PostgreSQL. Которого у меня нет
Так что я много чего перепробовал, но все не работает. В настоящее время я использую sqlite backend. Sqlite может легко выполнить запрос, как мне нужно, но как заставить django сделать это?