У меня есть модель с полями area (регион), city (город), district (район). Есть и другие поля, но речь не про них. Как правильно выбрать все записи из таблицы, уникальные по этим трём полям (то, какое будет значение id, мне не важно)? .values('area', 'city', 'district').distinct() не подходит, т.к. мне нужны все столбцы таблицы, а не только те, что в values перечислены. Может можно как-то группировку сделать по этим 3-м полям, но при этом без annotate (т.к. мне не нужна агрегация)
Там довольно простенький ORM... там даже цепочку JOIN надо уметь готовить, чтобы она не рассыпалась на множество запросов... Если бы ORM был прекрасен, не придумывали raw-запросы, Q-запросы и т.п. ... И, если честно, лишний слой абстракции в виде ОRM -- часто лишний... Если соберётесь мигрировать на другую СУБД эффективнее найти все запросы и все критичное переписать под её специфику А иначе в чем смысл замены этой СУБД?
Сергей Еремин, это всё отдельная тема для дискуссий. Я Django не сильно люблю, но тут потребовалось. ORM разные вообще бывают: та же Doctrine или TypeORM сильно более гибкие (если query builder юзать), но речь не об этом. Я бы с удовольствием отказался тут от ORM, но дело в том, что тут есть всякие фильтры и сортировки (которые могут быть, а могут не быть) - и очень не хочется raw-запрос в виде строки по кусочкам конкатенировать в if-условиях.
Из вашего изначального запроса и последнего комментария видно что сама база криво под данные задачи спланирована и нормирована (повторяющиеся поля с одинаковыми значениями -- тому свидетельство)... Ну а если база не подготовлена под требования запросов, то надо быть готовым к компромиссам.
На мой взгляд разумный компромисс -- на стороне приложения делать, или использовать дополнительные батарейки типа sqlalchemy (батарейки, кстати, тоже тоже на стороне приложения будут делать, но хоть код "чище")...
Сергей Еремин, т.е., по-вашему, если в базе содержатся дубли по некоторым (не по всем, конечно), то это криво спроектированная БД? Странное утверждение.
Это значит, что она не спроектирована под те запросы, которыми вы к ней хотите обратиться... Дублировать данные, если вам нужна скорость записи -- вполне решение.