Django:具有 ManyToMany 的高级 StringAgg
Django: Advanced StringAgg with ManyToMany
设置
我有两个 table:
人
姓名
蒂姆
汤姆
谭
宠物
|物种 |颜色 |
|--------|--------|
|猫 |黑色 |
|狗 |棕色 |
以及连接它们的 ManyToMany:
人与宠物
Person.name
Pet.species
蒂姆
猫
蒂姆
狗
汤姆
猫
想要的结果
使用 Django,我想注释 Person 这样我得到这个 table:
这可能吗?
我只有这个:
from django.contrib.postgres.aggregates import StringAgg
Person.objects.annotate(
result=StringAgg('pets', delimiter=',')
)
给出:
Person.name
结果
蒂姆
猫狗
汤姆
猫
谭
谁能破解这个难题?
找到解决方案:
from django.contrib.postgres.aggregates import StringAgg
from django.db.models.functions import Concat
from django.db.models import Case, Value, When, F, Value, CharField
Person.objects.annotate(
result=StringAgg(
Case(
When(
pets__isnull=False,
then=Concat(
# <a>{species} ({color})\<a>
Value('<a>'),
F('pet__species'),
Value(' ('),
F('pet__color'),
Value(')</a> '),
output_field=CharField()
)
)
),
delimiter=''
)
)
设置
我有两个 table:
人
姓名 |
---|
蒂姆 |
汤姆 |
谭 |
宠物 |物种 |颜色 | |--------|--------| |猫 |黑色 | |狗 |棕色 |
以及连接它们的 ManyToMany:
人与宠物
Person.name | Pet.species |
---|---|
蒂姆 | 猫 |
蒂姆 | 狗 |
汤姆 | 猫 |
想要的结果
使用 Django,我想注释 Person 这样我得到这个 table:
这可能吗?
我只有这个:
from django.contrib.postgres.aggregates import StringAgg
Person.objects.annotate(
result=StringAgg('pets', delimiter=',')
)
给出:
Person.name | 结果 |
---|---|
蒂姆 | 猫狗 |
汤姆 | 猫 |
谭 |
谁能破解这个难题?
找到解决方案:
from django.contrib.postgres.aggregates import StringAgg
from django.db.models.functions import Concat
from django.db.models import Case, Value, When, F, Value, CharField
Person.objects.annotate(
result=StringAgg(
Case(
When(
pets__isnull=False,
then=Concat(
# <a>{species} ({color})\<a>
Value('<a>'),
F('pet__species'),
Value(' ('),
F('pet__color'),
Value(')</a> '),
output_field=CharField()
)
)
),
delimiter=''
)
)