Django:检索一个模型属性的列表,以获取另一个属性的所有不同值

bpsygsoo  于 2022-11-18  发布在  Go
关注(0)|答案(1)|浏览(156)

我想使用Django ORM来给予我一个对象子集的模型属性值列表,这些对象子集具有另一个属性的不同值。考虑一个简单的模型,如:

class Result(models.Model):
    color = models.CharField()
    score = models.IntegerField()

假设我有四个结果:

results = [
    Result(color="blue", score=5), 
    Result(color="blue", score=3), 
    Result(color="red", score=10), 
    Result(color="red", score=8),
]

我想得到的是类似下面的东西:

{
    {"color”: "blue", "scores": [5, 3]}, 
    {"color": "red", "scores": [10, 8]},
}

我认为使用Django的聚合和注解特性可以一次完成,但我一直在努力想办法。我知道我可以用下面的方法得到平均分:

results.values("color").annotate(avg_score=Avg("score"))

如果这是可能的,那么获得用于生成平均值的列表也一定是可能的,对吗?

mkshixfv

mkshixfv1#

不幸的是,这将取决于你的DB。
如果使用Postgresql,则可以访问ArrayAgg,因此可以执行以下操作:

results.values("color").annotate(scores=ArrayAgg("score"))

如果您使用的是MySQL或MariaDB,则可以使用GroupConcat。
但这不会产生数组,它会产生一个字符串,其中的值用逗号分隔。
如果将使用Python操作此字段,则可以执行以下操作来获取数组:

my_result.scores.split(",")

相关问题