Group_by и фильтр Django - PullRequest
       6

Group_by и фильтр Django

0 голосов
/ 24 января 2020

Я пытаюсь сделать и запросить в Django, но я не могу получить желаемый результат. Я хочу использовать group by и фильтровать в Django Query, я пытался использовать annotate, просматривая некоторые ответы на stackoverflow и некоторых других сайтах, но не смог заставить его работать. Вот мой ответ после использования фильтра.

[
{
"id": 11667,
"rate_id": "FIT-PIT2",
"name": "FIT-PIT111",
"pms_room": null,
"description": null,
"checkin": "",
"checkout": "",
"connected_room": null
},
{
"id": 11698,
"rate_id": "343",
"name": "dfggffd",
"pms_room": "5BZ",
"description": null,
"checkin": null,
"checkout": null,
"connected_room": null
},
{
"id": 11699,
"rate_id": "343",
"name": "dfggffd",
"pms_room": "6BZ",
"description": null,
"checkin": null,
"checkout": null,
"connected_room": null
}]

Что я хочу сделать, это сгруппировать все те pms_rooms, которые имеют одинаковые rate_id, примерно что-то вроде этого {'343':['5BZ','6BZ'],'FIT-PIT2':[null]} Я могу сделать это с помощью словаря или список

Но я хочу сделать это прямо из запроса, например table.objects.filter(condition).group_by('rate_id'), что-то SQL эквивалент SELECT *,GROUP_CONCAT('name') FROM TABLE NAME WHERE PMS = hotel.pms GROUP BY rate_id. Может кто-нибудь, пожалуйста, помогите мне. Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 января 2020

Поскольку в вашем примере упоминается GROUP_CONCAT, я предполагаю, что вы используете MySQL. Django изначально не поддерживал GROUP_CONCAT, но вы можете попробовать django-MySQL, который поддерживает эквивалентную функцию базы данных GroupConcat. Затем вы можете сделать запрос, подобный следующему:

table.objects.values('rate_id').annotate(grouped_rooms=GroupConcat('pms_room'))

Результат может быть таким:

[
    {
        'rate_id': '343',
        'grouped_rooms': '5BZ,6BZ',
    },
    {
        'rate_id': 'FIT-PIT2',
        'grouped_rooms': '',
    },
    ...
]

На самом деле не соответствует формату, который вы упомянули в OP, но вы можете сделать некоторую запись обработайте этот результат в нативном python, чтобы он соответствовал ожидаемому.

0 голосов
/ 24 января 2020

table.objects.filter(condition).values('rate_id'), проверьте do c https://docs.djangoproject.com/en/3.0/ref/models/querysets/

...