我正在研究Django内置的用户实现,并有一些问题
id
字段,但为什么不在文档中(错误,或者我不应该使用它?)用户被删除并重用ID的示例代码(在django shell中)
userA = User.objects.create_user('userA')
userA.id # (prints 2 for example)
# I go to the admin page, I see the new user
userA.delete()
# Admin page, userA gone
userB = User.objects.create_user('userB')
userB.id # (prints 2 again)
# UserB is visible in the admin page
答案 0 :(得分:1)
你是从错误的地方开始的。如果你想知道Django模型是如何工作的,你应该阅读教程和模型文档,而不是认证文档,它们自然会错过所有非特定用户模型的东西。每个Django模型都有一个自动增量id字段,如那些模型文档中所述。
我怀疑文档声明你不应该删除用户。当用户被删除时,我不明白现在是“免费”ID的相关性。该ID当然不会被重用,因为db自动增量已经开始了。这是RDBMS如何工作的基础。
自然地,并发和事务都包含在事务文档中。
修改强>
我已经编辑了丹尼尔的答案,其中包括一些他没有回答的内容(但是看了一般的django模型文档,因为他说我确实学到了很多东西 - 没有意识到Django的用户只是建立在它的模型上API)。
所有模型都定义了一个自动递增的主键整数id字段。这是识别用户的最佳方式。和所有其他模型一样,您也可以搜索其他列。
我确实在文档中找到了建议不删除用户的地方(因为我仔细阅读了几次 - 这很令人惊讶),尽管我从那时起就没有看过它。也许它在以后的版本中删除了。重复使用已删除ID的奇怪行为是sqlite 所特有的。说MySQL或Postgresql等不会发生这种情况。不要记得只有当删除的id是以前的最大值时才重用id,或者它们是否总是被重用(即选择当前未分配给它的最低值)行)
Django有transactions interface,可让您控制事务/保存点/自动提交模式。当您进行查询时,它甚至支持select ... for update
Django支持on delete ...
。 然而这是在Django级别强制实施的。如果检查生成的sql查询以创建表,您会注意到它没有on delete ...
。请参阅Django not setting MySQL ON DELETE = CASCADE