2009-02-05 53 views
6

我有一个二十个字节的十六进制散列,我想在django模型中存储。 如果我使用文本字段,它将被解释为unicode,并且它回来乱码。在Django模型字段中存储二进制散列值

目前我正在对它进行编码并对它进行解码,这实际上使代码更加混乱,因为我必须能够通过它进行过滤。

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开发的办法,但我真的努力达成协议的事实,这是这个丑陋的只是存储二十个字节。

也许是我太纯粹的,但最好我能写

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

性能让我写:

change.changeset = ctx.node() 

所以这是一样好,我可以问。

回答

4

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

否则,你可能会试着写一个custom field type

+2

n.b.尽管这个答案已经四年了,但BinaryField并没有在Django(1.5)的最新版本中,而是在当前的开发版本中。 – 2013-03-28 22:40:42

3

你也可以编写自己定制的Model Manager,它可以为你逃避和消除。

3

“我有一个二十个字节的十六进制散列,我想在django模型中存储。”

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

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

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

编辑 - 代码几乎相同。

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

+0

使用不同的编码不会使代码更清洁。如果我仍然需要编码和解码,我还没有获得任何东西。 – mbarkhau 2009-02-06 18:29:12

+1

对不起,如果我的答案困惑你。我修改了它。摘要()和十六进制()几乎相同。除了你可以坚持hexdigest()。你不能轻易坚持摘要()。 – 2009-02-06 19:25:42

1

如果这个问题仍然是兴趣,Disqus' django-bitfield符合该法案:

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

... GitHub上的示例代码是在第一W/A有点混乱r/t模块的实际功能,因为asinine变量的名称 - 通常我不是那种用资金或高地把某人的愚蠢标识符带到任务中的人......但是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

0

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

相关问题