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(",")