9

我有一个 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()

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

4

5 回答 5

4

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

于 2017-08-09T12:24:38.850 回答
3

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

否则,您可能会尝试编写自定义字段类型

于 2009-02-05T19:23:07.467 回答
3

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

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

不要使用someHash.digest()-- 你得到的字节是你不能轻易存储的。

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

编辑——代码几乎相同。

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

于 2009-02-06T00:59:44.013 回答
2

您还可以编写自己的自定义模型管理器,为您进行转义和取消转义。

于 2009-02-05T19:52:58.390 回答
1

如果这个问题仍然令人感兴趣,Disqusdjango-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

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

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

于 2012-09-19T14:22:44.573 回答