在Django模型字段中存储二进制散列值

2024-06-01 12:39:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

所以这是我能要求的。


Tags: django模型文本selfnodeget字节objects
3条回答

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

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

不要使用someHash.digest()——您会得到字节,但无法轻松存储。

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

编辑--代码几乎相同。

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

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

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

您还可以编写自己的自定义Model Manager,为您执行转义和不转义操作。

相关问题 更多 >