将Django二进制字段转换为数组

3

我使用Django与遗留的Oracle数据库。在这个数据库中,有一个作为blob保存的数组,我想用Django读取它。模型类是通过使用manage.py inspectdb命令自动生成的。

class myTable(models.Model):
     myRow = models.BinaryField(blank=True, null=True)

如何将二进制字段转换为数组?
谢谢。

你可以使用Django的model_to_dict将模型数据转换为字典,然后将字典转换为列表/数组。从django.forms.models导入model_to_dict,model_to_dict(实例,fields = ['myRow',(+您想要包括的其他字段)])。 - user1749431
我尝试了一下,model_to_dict返回了一个空字典。字段中存储的数据是二进制编码的。这个函数应该如何知道什么是键或值? - karl16
它应该返回一个以字段名/对象为键,字段值为值的字典。如果有多个字段,则返回一个多键字典。如果字段中有数据,则应返回该数据,请尝试在不使用字段列表的情况下运行代码,参见文档https://docs.djangoproject.com/en/1.8/_modules/django/forms/models/。第二种选择是使用过滤器,也返回类似于models_to_dict的字典;filtered_dict = myTable.objects.values('myRow')。 - user1749431
从django.forms.models导入model_to_dict,然后在views中使用; instance = myTable(),print model_to_dict(instance),返回{u'myRow': ..fieldcontent}。 - user1749431
1个回答

0

我通过在Python中使用struct模块解决了这个问题。 在我的情况下,打包在myRow二进制字段中的向量表示如下:

32 bit encoding | 32 bit number of elemnets (n) | n * encoding size 

例如,对于一个双精度向量:

    from struct import *

def getBlobVectorValues(blobData, formatStr):
    return unpack_from(formatStr,blobData, offset=8)

def getBlobVectorSize(blobData):
    blobSize = unpack_from('!I',blobData, offset=4)
    return blobSize[0]

def readBlob(blobData):
    blobEncoding = unpack_from('!I',blobData, offset=0)
    formatStr = "!"

    if (blobEncoding[0] == 23):       #encoding vector<double> 

        vectorSize = getBlobVectorSize(blobData)       
        for x in range(0, vectorSize):
            formatStr += "d"

    else:
        raise ValueError("Unexpected blob encoding: %d" % blobEncoding[0])

    return getBlobVectorValues(blobData,formatStr)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接