我使用 SQLite 并有一個包含以下資料的 django 模型:
| 姓名 | 價值 |
|---|---|
| 一個 | 1 |
| 乙 | 2 |
| 乙 | 4 |
| C | 7 |
| C | 5 |
我想使用匯總表,以便我可以獲取以下格式的資料:
| 姓名 | 價值 |
|---|---|
| 一個 | 1 |
| 乙 | [2,4] |
| C | [7,5] |
我如何用 Django 做到這一點。
我想這可能是答案,但 Django 似乎沒有 ArrayAgg。這看起來是一個 PostgreSQL 函式
Test_Model.objects.annotate(dname=ArrayAgg('name')).values()
你知道我如何在不使用 PostgreSQL 的情況下實作這一目標嗎?謝謝!
uj5u.com熱心網友回復:
對于PostgreSQL,Django 有一個ArrayAgg函式 [Django-doc]:
from django.contrib.postgres.aggregates import ArrayAgg
Test_Model.objects.values('name').annotate(dname=ArrayAgg('value')).order_by('name')
uj5u.com熱心網友回復:
您可以使用groupbyfrom itertools,然后為任何資料庫創建聚合:
>>> from itertools import groupby
>>> [{'Name': key, 'Value': list(item.Value for item in grp)} for key, grp in
groupby(Test_Model.objects.order_by('Name'), key=lambda x: x.Name)]
[{'Name': 'A', 'Value': [1]},
{'Name': 'B', 'Value': [2, 4]},
{'Name': 'C', 'Value': [7, 5]}]
uj5u.com熱心網友回復:
首先像這樣創建自己的聚合
from django.db.models import Aggregate
class GroupConcat(Aggregate):
function = 'GROUP_CONCAT'
template = '%(function)s(%(distinct)s%(expressions)s)'
def __init__(self, expression, distinct=False, **extra):
super(GroupConcat, self).__init__(
expression,
distinct='DISTINCT ' if distinct else '',
output_field=CharField(),
**extra)
在下面的查詢中創建此用途后
Test_Model.objects.values('name').annotate(dname=GroupConcat('value')).order_by('name')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/517285.html
標籤:PythondjangoPostgreSQL模型视图控制器
下一篇:表格未定義問題?
