我有一个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()
这就像我可以问的那样好。
答案 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()
- 您会收到一个可以轻松存储的字符串。
修改 - 代码几乎相同。
答案 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
字段:
答案 4 :(得分:1)
从1.6开始,Django允许BinaryField
允许存储原始二进制数据。但是,对于高达128位的散列和其他值,使用Django 1.8 +中的UUIDField
更有效(至少使用PostgreSQL后端)。