User
и Group
связаны друг с другом с использованием ManyToManyField
. Это означает, что существует таблица пересечений, связывающая оба объекта, и если вы не укажете модель для ее сопоставления (используя атрибут through
), Django создает для вас одну. Глядя на источники для django.contrib.auth.models
Я вижу, что это так.
Fortunatly, вы можете получить доступ к этой промежуточной модели, используя атрибут through
менеджера (в данном случае User.groups.through
). Тогда вы можете использовать его, как и любую обычную модель. Пример:
>>> alice = User.objects.create_user('alice', '[email protected]', 'alicepw')
>>> employee = Group.objects.create(name='employee')
>>> manager = Group.objects.create(name='manager')
>>> alice.groups.add(employee)
>>> alice.groups.all()
[<Group: employee>]
>>> alice_group = User.groups.through.objects.get(user=alice)
>>> alice_group
<User_groups: User_groups object>
>>> alice_group.group = manager
>>> alice_group.save()
>>> alice.groups.all()
[<Group: manager>]
>>>
(переводы строк добавлены для читаемости)
mgibsonbr ответ хорош, но мне было интересно, если у вас есть много пользователей, изменяя их группу каждый второй? Если это не так (это означает, что изменяющаяся группа не выполняется очень часто), вы не должны заботиться об этой неэффективности. Не делайте преждевременных оптимизаций. – Etienne
Хорошо. Спасибо за совет. – Alex