2010-07-14 2 views
1

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

>>> 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']) 

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

ответ

0

Это происходит из-за того, что у Пользователя существует много много отношений с разрешением, поэтому, когда вы делаете user.user_permissions.add(p), таблица «auth_user» не обновляется. Вместо этого, это «сквозная» таблица для этих отношений («auth_user_user_permissions»), которая обновляется. Фактически, вам не нужно звонить user.save().

Метод get_all_permissions(), как представляется, используя данные в кэше, так что если вы хотите, чтобы последние изменения, использование:

user.user_permissions.all() 

Обратите внимание, что это будет возвращать список объектов разрешений, так что если вы хотите получить список кодовых в том же формате, как get_all_permissions() вызова (не уверен, почему вы бы хотя), вы можете сделать это:

set(user.user_permissions.values_list('codename', flat=True)) 
2

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

+0

Так что объясняет, что происходит, но на самом деле не почему? или лучший способ обновить объекты в памяти с изменениями на диске? – Doug

+0

Приведенный вами пример - это особый случай, потому что метод get_all_permissions() ', который является методом, зависящим от модели пользователя, использует кеширование. Если вы используете более общие методы/свойства модели Django, вы обнаружите, что они ведут себя более интуитивно и будут обновляться, когда вы ожидаете их. –

Смежные вопросы