为 Django 模型生成非序列 ID/PK

2024-03-11

我即将开始开发新的网络应用程序。其中一部分将为用户提供可以以一对多关系进行自定义的页面。这些页面自然需要有唯一的 URL。

留给自己的设备,Django 通常会分配一个标准AUTOINCREMENT模型的 ID。虽然这效果非常好,但看起来不太好,而且还使页面非常可预测(在本例中这是不需要的)。

我想要的是设定长度、随机生成的字母数字字符串(例如 h2esj4),而不是 1、2、3、4。一组可能的 36 个字符中的 6 个位置应该会给我超过 20 亿个组合,这在这个阶段应该是绰绰有余的。当然,如果以后能扩展一下,那就太好了。

但有两个问题:

  1. 随机字符串偶尔会拼出坏词或其他令人反感的短语。有没有一个好的方法来回避这个问题?公平地说,我可能会选择数字字符串,但它确实对冲突的可能性有很大影响。

  2. 如何让 Django(或数据库)完成插入方面的繁重工作?我宁愿不插入和then找出关键(因为这不会是一个关键)。我认为如果同时生成两个新页面并且第二个页面(尽管困难重重)在提交第一个页面之前神奇地获得与第一个页面相同的密钥,那么也需要注意并发问题。

我认为这与 URL 缩短器生成 ID 的方式没有一百万英里的不同。如果有一个像样的 Django 实现,我可以利用它。


有内置的 Django 方法来实现你想要的。将字段添加到“自定义页面”模型中primary_key=True and default=密钥生成函数的名称,如下所示:

class CustomPage(models.Model):
    ...
    mykey = models.CharField(max_length=6, primary_key=True, default=pkgen)
    ...

现在,对于每个模型实例page, page.pk成为别名page.mykey,它会自动分配给函数返回的字符串pkgen()在创建该实例的那一刻。
快速&肮脏的实施:

def pkgen():
    from base64 import b32encode
    from hashlib import sha1
    from random import random
    rude = ('lol',)
    bad_pk = True
    while bad_pk:
        pk = b32encode(sha1(str(random())).digest()).lower()[:6]
        bad_pk = False
        for rw in rude:
            if pk.find(rw) >= 0: bad_pk = True
    return pk

两个页面获得相同主键的概率非常低(假设random()足够随机),并且不存在并发问题。当然,通过从编码字符串中切片更多字符,可以轻松扩展此方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为 Django 模型生成非序列 ID/PK 的相关文章

随机推荐

  • 什么是“命名空间清洁度”,glibc 是如何实现的?

    我从以下地方看到这一段 zwol 的回答 https stackoverflow com a 57728805 10795151最近 The libc 前缀于read是因为实际上有三个不同的名称read在 C 库中 read read an
  • 什么是二进制空字符?

    我需要创建 sysDesk 日志文件 在此要求中 我应该创建一个 XML 文件 该文件在元素之间的某些位置包含二进制空字符 有人可以向我解释一下 首先什么是二进制空字符 以及如何将其写入文本文件 我怀疑这意味着 Unicode U 0000
  • 应用程序打开时不显示通知

    应用程序运行时不显示通知 当应用程序关闭时它会起作用 MyFirebaseMessagingService java public class MyFirebaseMessagingService extends FirebaseMessa
  • 即使更改别名后,终端也仅运行 2.7

    如何让终端运行像 manage py 这样的脚本 它将使用 python3 而不是 python2 如果我输入 python 它会运行 python3 但此命令会运行 python2 你的第一行manage py应该 usr bin env
  • Node.js 中的活动句柄是什么

    我发现我的应用程序活动句柄数不断增加 活动句柄的数量究竟是多少 这是我必须注意防止应用程序崩溃的事情吗 活动手柄 句柄是对开放资源 例如打开的文件 数据库连接或请求 的引用 为了理解为什么句柄应该处于关闭状态却可能处于活动状态 我给你一个简
  • 可以在 Spark 批处理上创建模型并在 Spark 流中使用它吗?

    我可以在 Spark Ba tch 中创建模型并将其用于 Spark Streaming 进行实时处理吗 我在 Apache Spark 网站上看到了各种示例 其中训练和预测都是基于相同类型的处理 线性回归 构建的 我可以在 Spark B
  • 使用没有 json 文件的 Google 应用程序默认凭据

    我使用 C 创建了一个控制台应用程序 我使用了谷歌云语音API 我跟着this https github com GoogleCloudPlatform dotnet docs samples tree master speech api
  • 在 Atom 中使用多个游标时有没有办法增加数字?

    我发现自己一遍又一遍地这样做 这可能非常耗时 有哪些选项可用于此 The 增量选择 https atom io packages increment selection包可能就是您正在寻找的 它似乎可以使用多个游标 因此应该非常接近您的用例
  • 获取 DataFrame 的日期时间列的工作日/星期几

    我有一个数据框df如下所示 摘录 时间戳 是索引 Timestamp Value 2012 06 01 00 00 00 100 2012 06 01 00 15 00 150 2012 06 01 00 30 00 120 2012 06
  • 如何在recyclerView中设置可见性小部件

    我有谷歌地图和集群数据 当我单击某个集群时 会显示水平回收器视图 我有 imageButton 它是 CardView 中的下一个或上一个按钮 当我单击它时 cardView 会滚动到下一个位置 它工作完美 但我有一个问题 我的第一个 Ca
  • 如何在 data.frame 中引用 data.frame 的列?

    我有一个名为 series to plot df 的 data frame 它是通过将许多其他 data frame 组合在一起创建的 如下所示 我现在只想从每个列中提取 mm 列 以便我可以绘制它们 所以我想拉出每个 data frame
  • 如何root Genymotion Android 模拟器?

    我已经下载了 Genymotion Android Emulator 供个人使用 我在互联网上搜索以root此设备 论坛说通过adb shell它已经root 同意 Sumits MacBook Pro sdk eSumit adb s 1
  • 模拟Python的内置打印功能

    我试过了 from mock import Mock import builtin builtin print Mock 但这会引发语法错误 我也尝试过像这样修补它 patch builtin print def test somethin
  • 如何按因子生成随机治疗变量?

    Define x lt data frame ID letters 1 10 class as factor c rep 1 5 rep 2 5 treat rep 0 10 s t gt x ID class treat 1 a 1 0
  • javascript 使用 index.js 从“/folder”导入

    我注意到在一些案例中我看到过类似以下内容 reducers reducer1 js export default function reducer1 state action etc reducers reducer2 js export
  • 如何将两个ListView放在一列中?

    我有两个带有 ExpansionTile 的 ListView 我想将它们一个接一个地放在一个列中 该列中首先有一些其他小部件 这是我的代码 override Widget build BuildContext context TODO i
  • 爬行 Android 文件系统陷入可能的 SymLink 循环

    我正在尝试在没有 NIO 的情况下抓取 Android 设备的整个文件系统 包括目录和文件 来构建它的树 如果我有 NIO 那么我可以使用 WalkTree 或类似的 但我没有 我遇到的问题 在 Nexus 5 API 23 x86 模拟器
  • Symfony 2.8:从 2.7.7 更新到 2.8.0 后 isScopeActive 弃用

    我已经从 2 7 7 更新到 symfony 2 8 并且我得到了这个弃用 Symfony Component DependencyInjection Container isScopeActive 方法自 2 8 版本起已弃用 并将在 3
  • 在 F# 中重放记录的数据流

    我已将实时股票报价记录在 SQL 数据库中 其中包含字段Id Last and TimeStamp 最后是当前股价 双倍 以及TimeStamp is the DateTime记录价格变化的时间 我想以与传入相同的方式重播此流 这意味着如果
  • 为 Django 模型生成非序列 ID/PK

    我即将开始开发新的网络应用程序 其中一部分将为用户提供可以以一对多关系进行自定义的页面 这些页面自然需要有唯一的 URL 留给自己的设备 Django 通常会分配一个标准AUTOINCREMENT模型的 ID 虽然这效果非常好 但看起来不太