Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 理解django模型save的行为_Python_Django - Fatal编程技术网

Python 理解django模型save的行为

Python 理解django模型save的行为,python,django,Python,Django,在使用shell时,这让我感到困惑(权限没有反映更改): 为什么用户对象在保存时没有更新? 是否有保存和更新对象的方法?Django不会在磁盘对象发生更改时更新内存中的对象。您的第一个用户看起来仍然与从磁盘读取时一样。发生这种情况是因为用户与权限有很多关系,所以当您执行user.user\u permissions.add(p)时,“auth\u user”表不会更新。相反,它是更新的关系(“auth\u user\u user\u permissions”)的“through”表。实际上,您根

在使用shell时,这让我感到困惑(权限没有反映更改):

为什么用户对象在保存时没有更新?

是否有保存和更新对象的方法?

Django不会在磁盘对象发生更改时更新内存中的对象。您的第一个用户看起来仍然与从磁盘读取时一样。

发生这种情况是因为用户与权限有很多关系,所以当您执行
user.user\u permissions.add(p)
时,“auth\u user”表不会更新。相反,它是更新的关系(“auth\u user\u user\u permissions”)的“through”表。实际上,您根本不需要调用
user.save()

get\u all\u permissions()
方法似乎正在使用缓存数据,因此如果您想要最新的更改,请使用:

user.user_permissions.all()
请注意,这将返回权限对象的列表,因此,如果您想要一个与
get\u all\u permissions()
调用格式完全相同的代码名列表(不确定为什么),可以执行以下操作:

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

这就解释了发生了什么,但不是真正的原因?或者使用磁盘上的更改更新内存中对象的最佳方法?您给出的示例是一种特殊情况,因为
get\u all\u permissions()
方法(一种
用户
特定于模型的方法)碰巧使用了缓存。如果您使用更通用的Django模型方法/属性,您会发现它们的行为更直观,并且会在您期望的时候更新。
set(user.user_permissions.values_list('codename', flat=True))