2009-02-05 113 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

相關問題