Оптимизация объединений "один-ко-многим" в Django MySQL ORM для лучшего представления данных
В Django MySQL ORM я хотел объединить таблицы с отношениями "один-ко-многим". Рассмотрим сценарий, в котором один пользователь может принадлежать к нескольким отделам. Пользователи и отделы - это разные сущности. Теперь, если я хочу продемонстрировать строки в виде столбцов User и названия отделов, к которым принадлежит пользователь, в одном столбце в виде списка. Как сделать это наиболее эффективно?
Пример:
class User(models.Model):
name = models.CharField(max_length=100)
class Department(models.Model):
name = models.CharField(max_length=100)
user = models.ForeignKey(User, on_delete=models.CASCADE)
Вывод:
[
{'id': 1, 'name': 'John', 'department_names': ['HR', 'IT']},
{'id': 2, 'name': 'Alice', 'department_names': ['Finance']}
]
Я попробовал следующее:
queryset = User.objects.values(
'id',
'name',
).annotate(
department_names=Concat(
'department__name',
Value(', '),
output_field=CharField(),
)
).filter(
department__isnull=False
).distinct()
Но получил вот это:
<QuerySet [
{'id': 1, 'name': 'John', 'department_names': 'HR, '},
{'id': 1, 'name': 'John', 'department_names': 'IT, '},
{'id': 2, 'name': 'Alice', 'department_names': 'Finance,'}
]>
Ожидал чего-то такого:
<QuerySet [
{'id': 1, 'name': 'John', 'department_names': 'HR, IT'},
{'id': 2, 'name': 'Alice', 'department_names': 'Finance'}
]>