我试图在Django v1.1.1中建模一个VARBINARY MySQL字段。二进制字段存储数据的十六进制表示(即使用INSERT INTO test(bin_val) VALUES X'4D7953514C')。
阅读Django documentation1,我想出了一个解决方案:
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中的一个bug?)问题是你会如何模拟这样一个领域?
PS:与这个问题有关的是,这个ticket2在三年后仍然开放:(
1 Django:编写自定义模型字段
发布于 2014-11-01 14:31:09
问题是Django创建数据库表的方式,也与数据库排序有关。
我解决这个问题的方法如下:
utf8,将排序规则更改为utf8_binVARCHAR更改为MySQL表中的VARBINARYto_python方法return hexlify(value)中使用发布于 2009-10-19 13:51:17
您所提到的同样的票证也有一块地,它应该为实现该字段提供一些提示。
在任何情况下,将其存储在CharField中的真正问题是什么?
即使要实现bin字段,也可以扩展models.CharField并将其转换为to_python方法中的十六进制。
同样的问题也在前面得到了回答:在Django模型字段中存储二进制哈希值
发布于 2009-10-19 17:39:43
MySQL既不为VARBINARY字段存储十六进制表示,也不要求在INSERT语句中使用十六进制表示。与VARCHAR的唯一区别是,MySQL对其使用二进制排序规则。您可以传递任何8位字符串作为它的参数。
https://stackoverflow.com/questions/1587617
复制相似问题