Оптимизация объединений "один-ко-многим" в 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'}
]>
Вернуться на верх