Django: Получение списка одного свойства модели для всех различных значений другого свойства

Я хотел бы использовать 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"))

Если это возможно, то получение списка, используемого для генерации среднего значения, также должно быть возможно, не так ли?

К сожалению, это будет зависеть от вашей БД.
Если вы используете Postgresql, у вас есть доступ к ArrayAgg, так что следующее будет работать :

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

Если вы используете MySQL или MariaDB, вы можете использовать GroupConcat.
Но это не даст массив, а строку со значениями, разделенными запятыми.
. Если этим полем будут манипулировать с помощью Python, вы можете сделать следующее, чтобы получить массив:

my_result.scores.split(",")
Вернуться на верх