-1

我正在查看 Django 内置的用户实现,并且有几个问题

  1. 识别用户的正确方法是什么?用户名是唯一的 - 所以它可能是一个标识符,但它们很容易更改(u.username = 'somethingelse', u.save())。谷歌搜索找到一个id字段,但为什么不在文档中(一个错误,或者我不应该使用它?)
  2. 如何使用户 ID 自动递增?在文档中的某处,它建议不要删除用户,但我喜欢让用户根据需要删除他们的信息。我检查了 - 删除用户时,用户 ID 被释放
  3. Django 是如何做并发的?关于如何使您自己的查询并发证明有几个线程,但我没有找到任何关于 Django 的内置类(例如用户)是否是并发的。例如,是否有可能两个用户可以同时使用相同的用户名注册?这是一个相对简单的示例,因为可以使用普通的旧约束生成表,但是应该(?)使用事务的更复杂的情况(更新权限?)呢?
  4. django 会“删除级联”吗?回到问题 2,如果我删除了一个用户,并且与该用户 id 相关的所有内容都被删除了,我认为如果其他人获得相同的 id 是可以的(如果有人用用户为页面添加书签可能会造成混淆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
4

1 回答 1

1

你从错误的地方开始。如果你想知道 Django 模型是如何工作的,你应该阅读教程和模型文档,而不是身份验证文档,这自然会漏掉所有非用户模型特定的内容。每个 Django 模型都有一个自动递增的 id 字段,如那些模型文档中所述。

我怀疑文档声明您不应该删除用户。而且我不明白删除用户时现在有一个“免费”ID的相关性。该 ID 当然不会被重用,因为 db autoincrement 已经继续。这是 RDBMS 工作方式的基础。

并发和事务自然包含在事务文档中。

编辑

我编辑了 Daniel 的答案以包括一些他没有回答的事情(但是在查看了一般的 django 模型文档之后,正如他所说,我确实学到了很多东西——没有意识到 Django 的用户只是建立在它的模型 API 上)。

  1. 所有模型都定义了一个自动递增的主键整数 id 字段。这是识别用户的最佳方式。与所有其他模型一样,您也可以按其他列进行搜索。

  2. 我肯定在文档中的某个地方看到它建议不要删除用户(因为我仔细阅读了好几遍 - 这很令人惊讶),尽管从那以后我就再也没有见过它。也许它在以后的版本中被删除了。重用已删除 id的奇怪行为是 sqlite 独有的。说 MySQL 或 Postgresql 等不会发生这种情况。不要记住只有当删除的 id 是以前的最大值时才重用 id,或者它们是否总是被重用(即选择当前未分配给排)

  3. Django 有一个事务接口,可让您控制事务/保存点/自动提交模式。它甚至支持select ... for update您进行查询时

  4. Django 支持on delete .... 但是,这是在 Django 级别强制执行的。如果您检查生成的用于创建表的 sql 查询,您会注意到它并没有在on delete ...那里执行。请参阅Django 未设置 MySQL ON DELETE = CASCADE

于 2013-05-19T21:00:30.893 回答