Django:具有 ManyToMany 的高级 StringAgg

Django: Advanced StringAgg with ManyToMany

设置

我有两个 table:

姓名
蒂姆
汤姆

宠物 |物种 |颜色 | |--------|--------| |猫 |黑色 | |狗 |棕色 |

以及连接它们的 ManyToMany:

人与宠物

Person.name Pet.species
蒂姆
蒂姆
汤姆

想要的结果

使用 Django,我想注释 Person 这样我得到这个 table:

Person.name 结果
蒂姆 猫(黑色)狗(棕色)
汤姆 猫(黑色)

这可能吗?

我只有这个:

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=''
    )
)