Это происходит из-за того, что у пользователя много-много-много отношений с Разрешением, поэтому, когда вы делаете user.user_permissions.add(p)
, таблица «auth_user» не обновляется. Вместо этого обновляется таблица «through» для этого отношения («auth_user_user_permissions»). На самом деле, вам вообще не нужно звонить user.save()
.
Похоже, что метод get_all_permissions()
использует кэшированные данные, поэтому, если вы хотите получить последние изменения, используйте:
user.user_permissions.all()
Обратите внимание, что при этом будет возвращен список объектов Permission, поэтому, если вы хотите получить список кодовых имен в том же формате, что и вызов get_all_permissions()
(хотя и не знаете, зачем это нужно), вы можете сделать это:
set(user.user_permissions.values_list('codename', flat=True))