【问题标题】:Group_by and filter DjangoGroup_by 和过滤 Django
【发布时间】:2020-05-10 10:47:21
【问题描述】:

我正在尝试在 Django 中进行制作和查询,但我无法获得我想要的输出。我想在 Django Query 中使用 group by 和 filter,我尝试通过查看 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
}]

我想要做的是将所有具有相同rate_idpms_rooms 分组,大致是这样的 {'343':['5BZ','6BZ'],'FIT-PIT2':[null]} 我可以使用 dictionary 或 list 来做到这一点。

但我想直接从 table.objects.filter(condition).group_by('rate_id') 之类的查询中执行此操作,SQL 等效于 SELECT *,GROUP_CONCAT('name') FROM TABLE NAME WHERE PMS = hotel.pms GROUP BY rate_id 。有人可以帮帮我吗。谢谢。

【问题讨论】:

标签: python django python-3.x django-models


【解决方案1】:

由于您的示例提到了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 中对此结果进行一些后期处理,以使其符合您的预期。

【讨论】:

    【解决方案2】:

    table.objects.filter(condition).values('rate_id'),查看文档https://docs.djangoproject.com/en/3.0/ref/models/querysets/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 2021-01-28
      • 2019-12-19
      相关资源
      最近更新 更多