Django:如何建模MySQL VARBINARY HEX字段?

时间:2009-10-19 08:57:49

标签: python mysql django model varbinary

我正在尝试在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')

但是这不能正常工作,因为:

  • Django对MySQL的二进制数据进行Unicode转换
  • 保存新的MyTest对象时,get_db_prep_value()会被调用两次(我认为这是Django中的一个错误?)

问题是你如何塑造这样一个领域?

PS:与此问题相关的是此票[2]在3年后仍然打开:(

[1] Django:编写自定义模型字段

[2] http://code.djangoproject.com/ticket/2417

2 个答案:

答案 0 :(得分:1)

问题在于Django创建数据库表的方式,也与数据库排序规则有关。

我解决它的方式如下:

  • 将表格字符集更改为utf8,将排序规则更改为utf8_bin
  • 在MySQL表格中将二进制字段从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