Django获取一个链接到查询集中每个父记录ID的相关id的列表?

时间:2018-04-10 12:25:19

标签: django

我有一个关系客户有很多项目。

我想创建一个表单字典:

{
    'client_id': ['project_id1', 'project_id2'],
    'client_id2': ['project_id7', 'project_id8'],
}
我试过的是什么;

clients_projects = Client.objects.values_list('id', 'project__id')

给了我:

<QuerySet [(3, 4), (3, 5), (3, 11), (3, 12), (2, 3), (2, 13), (4, 7), (4, 8), (4, 9), (1, 1), (1, 2), (1, 6), (1, 10)]>

我可以使用list(clients_projects)转换为列表:

[(3, 4),
 (3, 5),
 (3, 11),
 (3, 12),
 (2, 3),
 (2, 13),
 (4, 7),
 (4, 8),
 (4, 9),
 (1, 1),
 (1, 2),
 (1, 6),
 (1, 10)]

2 个答案:

答案 0 :(得分:1)

假设projects是附加到ReverseManyToOneDescriptor模型的Client,您可以写下:

clients_projects = { c.id : c.projects.values_list('id', flat=True) for c in Client.objects.all() } 

答案 1 :(得分:1)

此问题与此问题非常相似:Django GROUP BY field value 由于Django没有提供group_by(你),你需要手动复制行为:

result = {}
for client in Client.objects.all().distinct():
    result[client.id] = Client.objects.filter(id=client.id)
                                      .values_list('project__id', flat=True)

<强>故障:

  • 从您的Client模型中获取一组不同的客户端并迭代它们。
    如果您愿意,也可以通过添加.order_by('id')来订购该集合。 / em>的)
  • 由于您只需要project__id作为列表,因此您可以使用values_list()flat=True参数,该参数会返回值列表。
  • 最后,result将如下所示:

    {
        'client_1_id': [1, 10, ...],
        'client_5_id': [2, 5, ...],
        ...
    }
    

有一个模块宣称要向Django添加GROUP BY功能:https://github.com/kako-nawao/django-group-by,但我还没有使用它,所以我只是在这里列出它而不是实际推荐它。