关于django'的问题;s用户API(用户id)

关于django'的问题;s用户API(用户id),django,concurrency,Django,Concurrency,我正在看Django的内置用户实现,有几个问题 识别用户的正确方法是什么?用户名是唯一的-因此可以作为标识符,但它们很容易更改(u.Username='somethingelse',u.save()。谷歌搜索发现一个id字段,但为什么文档中没有这个字段(一个错误,或者我不应该使用它?) 如何使用户id自动递增?在文档的某个地方,它建议不要删除用户,但我喜欢让用户删除他们的信息,如果他们愿意的话。我选中了-删除用户时,用户id被释放 Django如何实现并发性?关于如何使您自己的查询成为并发的证明

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

  • 识别用户的正确方法是什么?用户名是唯一的-因此可以作为标识符,但它们很容易更改(u.Username='somethingelse',u.save()。谷歌搜索发现一个
    id
    字段,但为什么文档中没有这个字段(一个错误,或者我不应该使用它?)
  • 如何使用户id自动递增?在文档的某个地方,它建议不要删除用户,但我喜欢让用户删除他们的信息,如果他们愿意的话。我选中了-删除用户时,用户id被释放
  • Django如何实现并发性?关于如何使您自己的查询成为并发的证明,这里有几个线程,但是我没有发现Django的内置类(例如用户)是否是并发的。例如,两个用户是否可以同时使用相同的用户名注册?这是一个相对简单的例子,因为表可以用一个简单的旧约束生成,但是对于更复杂的情况(更新权限?)应该(?)使用事务呢
  • django是否执行“删除级联”?回到问题2,如果我删除了一个用户,并且与该用户id相关的所有内容都被删除了,我认为如果其他人获得了相同的id也没关系(如果有人用该用户id将一个页面添加到书签中,而现在它是一个新用户,这可能会让人困惑)
  • 删除用户并重用ID的示例代码(在django shell中)


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

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

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

    编辑

    我对Daniel的答案进行了编辑,其中包括了一些他没有回答的问题(但在阅读了一般django模型文档后,他说我学到了很多东西——没有意识到django的用户只是基于其模型API构建的)

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

  • 我肯定在文档中看到了它建议不要删除用户的地方(因为我仔细阅读了好几次,这让我很惊讶),尽管从那以后我就没有看到过。可能是在以后的版本中删除了。重新使用已删除ID的奇怪行为是sqlite独有的。MySQL或Postgresql等都不会出现这种情况。不记得是仅当删除的id为以前的最大值时才重用id,还是始终重用id(即,选择当前未分配给行的最低值)

  • Django有一个用于控制事务/保存点/自动提交模式的。它甚至支持
    select。。。用于查询时更新

  • Django支持这项计划然而这是在Django级别强制执行的。如果您检查生成的sql查询以创建表,您会注意到它在删除时不会执行
    。看


  • 啊,我再也找不到链接了,但我确实在文档(官方或django书籍,它们都是绿色主题)中读到了一些建议,建议将用户设置为非活动状态,而不是删除它们,以维护外键,这正是我担心维护数据完整性的原因。此外,当我删除一个用户时,至少在我刚才尝试删除时,ID会被重新使用(问题中的示例)。我将查看通用模型文档-感谢您的指点。很明显,您的数据库设置有一些非常奇怪的地方。出于数据库完整性的明显原因,这绝对不应该发生。id字段是一个自动增量字段,设置新值由数据库负责,而不是Django。实际上,我刚刚意识到,您可能正在使用SQLite作为数据库,它可以重用已删除的id。如果这是一个问题,您可能应该使用一个合适的数据库,比如PostgreSQL,尤其是在部署时,您几乎肯定会这样做。啊,是的,我昨天也意识到了这一点(但没有机会更新这个问题)(我正在使用sqlite进行开发-只是玩玩而已)。然而,我认为sqlite会保持自动递增,如果您执行
    整型主键自动递增
    它不会重用ID吗?或者这不是django内置的(它不会为sqlite生成主键自动增量,因此不会重用键)。我正在对模型做更多的研究,如果这能回答我的问题,我会接受这个答案
    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