我正在尝试在Django v1.1.1中建模VARBINARY
MySQL字段。二进制字段存储数据的十六进制表示(即,将使用INSERT INTO test(bin_val) VALUES X'4D7953514C'
)
阅读Django文档[1]我想出了这个解决方案:
class MyTest(models.Model):
bin_val = BinValField()
class BinValField(models.Field):
__metaclass__ = models.SubfieldBase
def to_python(self, value):
""" DB -> Python """
return ''.join('%X%X' % ((ord(byte)>>4) & 0xF, ord(byte) & 0xF) for byte in value)
def get_db_prep_value(self, value):
""" Python -> DB """
return a2b_hex(value).decode('latin1')
但是这不能正常工作,因为:
get_db_prep_value()
会被调用两次(我认为这是Django中的一个错误?)问题是你如何塑造这样一个领域?
PS:与此问题相关的是此票[2]在3年后仍然打开:(
[1] Django:编写自定义模型字段
答案 0 :(得分:1)
问题在于Django创建数据库表的方式,也与数据库排序规则有关。
我解决它的方式如下:
utf8
,将排序规则更改为utf8_bin
VARCHAR
更改为VARBINARY
to_python
方法return hexlify(value)
答案 1 :(得分:0)
你提到的同一张票也有a patch,这应该给出一些指示来实现这个字段。
在任何情况下,你真正的问题是将它存储在CharField中吗?
即使您要实现bin字段,也可以扩展models.CharField并在to_python方法中将其强制转换为十六进制。
此前也回答了同样的问题:Storing a binary hash value in a Django model field