在Django模型字段中存储二进制哈希值

时间:2009-02-05 18:51:50

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

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

这就像我可以问的那样好。

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

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

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

使用someHash.hexdigest() - 您会收到一个可以轻松存储的字符串。

修改 - 代码几乎相同。

请参阅http://docs.python.org/library/hashlib.html

答案 2 :(得分:3)

您也可以编写自己的自定义Model Manager,为您进行转义和转移。

答案 3 :(得分:1)

如果这个问题仍有意义,Disqus django-bitfield符合条件:

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

... GitHub上的示例代码在模块的实际功能上有点令人困惑,因为asinine变量名称 - 通常我几乎不是那种具有wherewithal或者将某些人的愚蠢标识符带到任务的制高点......但flaggy_foo ?? Srsly,你们。

如果该项目不符合您的要求,并且您使用的是Postgres,那么您有很多很好的选择,因为许多人已经编写并发布了各种Django字段的代码,这些字段利用了Postgres的原生类型。这是一个hstore模型字段:

https://github.com/jordanm/django-hstore - 我已经使用了它并且效果很好。

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

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

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

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

答案 4 :(得分:1)

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