关于django的用户API(用户ID)的问题

时间:2013-05-19 20:47:59

标签: django concurrency

我正在研究Django内置的用户实现,并有一些问题

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

1 个答案:

答案 0 :(得分:1)

你是从错误的地方开始的。如果你想知道Django模型是如何工作的,你应该阅读教程和模型文档,而不是认证文档,它们自然会错过所有非特定用户模型的东西。每个Django模型都有一个自动增量id字段,如那些模型文档中所述。

我怀疑文档声明你不应该删除用户。当用户被删除时,我不明白现在是“免费”ID的相关性。该ID当然不会被重用,因为db自动增量已经开始了。这是RDBMS如何工作的基础。

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

修改

我已经编辑了丹尼尔的答案,其中包括一些他没有回答的内容(但是看了一般的django模型文档,因为他说我确实学到了很多东西 - 没有意识到Django的用户只是建立在它的模型上API)。

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

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

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

  4. Django支持on delete ...然而这是在Django级别强制实施的。如果检查生成的sql查询以创建表,您会注意到它没有on delete ...。请参阅Django not setting MySQL ON DELETE = CASCADE