Понимание поведения модели сохранения Django - PullRequest
1 голос
/ 14 июля 2010

При использовании оболочки это меня смутило (разрешения не отражали изменения):

>>> user = User.objects.get(username='test')
>>> user.get_all_permissions()
set([])
>>> p = Permission.objects.get(codename="add_slide")
>>> user.user_permissions.add(p)
>>> user.save()
>>> user.get_all_permissions()
set([])
>>> user = User.objects.get(username='test')
>>> user.get_all_permissions()
set([u'slides.add_slide'])

Почему пользовательский объект не обновлялся при сохранении?
Есть ли способ сохранить и обновитьобъект

Ответы [ 2 ]

2 голосов
/ 14 июля 2010

Django не обновляет объекты в памяти при изменении объектов на диске.Ваш первый пользователь по-прежнему выглядит так, как он читал с диска.

0 голосов
/ 15 июля 2010

Это происходит из-за того, что у пользователя много-много-много отношений с Разрешением, поэтому, когда вы делаете 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...