Как я могу получить все группы Django и, по желанию, получить связанные с ними записи пользователей?

Это должно быть довольно просто, поскольку это очень просто с чистым SQL. У меня есть следующий запрос, который получает именно то, что я хочу в Django:

SELECT auth_group.id, auth_group.name, auth_user.username
FROM auth_group
LEFT JOIN auth_user_groups
  ON auth_group.id = auth_user_groups.group_id
LEFT JOIN auth_user
  ON auth_user_groups.user_id = auth_user.id
WHERE auth_user.id = 3
  OR auth_user.id IS NULL;

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

Вы можете сделать запрос с помощью:

from django.contrib.auth.models import Group
from django.db.models import F, Q

Group.objects.filter(
    Q(user=None) | Q(user=3)
).annotate(
    username=F('user__username')
)

Объекты Group, возникающие из этого кверисета, будут иметь дополнительный атрибут .username с именем пользователя. Хотя это введет, вероятно, много дублирующих данных, так как имя пользователя будет либо None (NULL), либо именем пользователя с id=3.

Вернуться на верх