【问题标题】:Storing a binary hash value in a Django model field在 Django 模型字段中存储二进制哈希值
【发布时间】:2010-10-05 18:21:28
【问题描述】:

我有一个 20 字节的十六进制哈希,我想将它存储在 django 模型中。 如果我使用文本字段,它会被解释为 unicode 并且返回乱码。

目前我正在对其进行编码和解码,这确实使代码混乱, 因为我必须能够通过它进行过滤。

def get_changeset(self):
    return bin(self._changeset)

def set_changeset(self, value):
    self._changeset = hex(value)

changeset = property(get_changeset, set_changeset)

这是一个过滤示例

Change.objects.get(_changeset=hex(ctx.node()))

这是 django 开发人员推荐的方法,但我真的很难接受仅存储 20 个字节就这么丑陋的事实。

也许我太纯粹了,但理想情况下我会写

Change.objects.get(changeset=ctx.node())

属性允许我写:

change.changeset = ctx.node()

所以这就是我可以要求的。

【问题讨论】:

    标签: python django encoding django-models binary-data


    【解决方案1】:

    从 1.6 开始,Django 有BinaryField 允许存储原始二进制数据。但是,对于高达 128 位的哈希值和其他值,使用 Django 1.8+ 中可用的UUIDField 会更有效(至少对于 PostgreSQL 后端而言)。

    【讨论】:

    • BinaryField 不支持查询,很遗憾
    【解决方案2】:

    如果这个问题仍然令人感兴趣,Disqus 的django-bitfield 符合要求:

    https://github.com/disqus/django-bitfield

    ... GitHub 上的示例代码起初有点令人困惑,因为模块的实际功能,因为 asinine 变量名称 - 通常我几乎不是那种拥有资金或高地采取别人的愚蠢标识符来完成任务......但是flaggy_foo?? Srsly,你们。

    如果该项目不符合您的口味,并且您正在使用 Postgres,那么您有很多出色的选择,因为许多人已经为利用 Postgres 的本机类型的各种 Django 字段编写和发布了代码。这是一个hstore 模型字段:

    https://github.com/jordanm/django-hstore -- 我用过这个,效果很好。

    这是一个使用 Postgres 的 termvector 类型的全文搜索实现:

    https://github.com/aino/django-pgindex

    虽然我不能保证这个特定项目,但也有 Django bytea 字段:

    https://github.com/aino/django-arrayfields

    【讨论】:

    • 就我个人而言,我将所有的十六进制哈希值都存储为文本,但我从来不需要在其中任何一个上创建索引,因此搜索性能不是问题(我认为你正面临这样的问题)
    【解决方案3】:

    “我有一个 20 字节的十六进制哈希,我想将它存储在 django 模型中。”

    Django 这样做。他们使用十六进制摘要,从技术上讲,它们是字符串。不是字节。

    不要使用someHash.digest()——你会得到字节,你不能轻易存储。

    使用someHash.hexdigest()——你会得到一个字符串,你可以很容易地存储它。

    编辑 -- 代码几乎相同。

    http://docs.python.org/library/hashlib.html

    【讨论】:

    • 使用不同的编码不会使代码更清晰。如果我仍然需要编码和解码,那我什么也没得到。
    • 对不起,如果我的回答让您感到困惑。我已经修改过了。 digest() 和 hexdigest() 几乎相同。除非你可以坚持 hexdigest()。你不能轻易地坚持 digest()。
    【解决方案4】:

    您还可以编写自己的自定义 Model Manager 来为您进行转义和取消转义。

    【讨论】:

      【解决方案5】:

      我假设如果您正在编写原始 SQL,您将使用 Postgres bytea 或 MySQL VARBINARY。有一个 ticket with a patch (标记为“需要测试”)据称制作了这样的字段(票证 2417:支持二进制类型字段(又名:postgres 中的 bytea 和 mysql 中的 VARBINARY))。

      否则,您可能会尝试编写custom field type

      【讨论】:

      猜你喜欢
      • 2017-06-16
      • 1970-01-01
      • 2019-08-02
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多