【问题标题】:Converting a Django binary field to an array将 Django 二进制字段转换为数组
【发布时间】:2016-02-11 10:29:43
【问题描述】:

我将 Django 与旧版 Oracle 数据库一起使用。在这个数据库中是一个保存为 blob 的数组,我想用 Django 读取它。 Model 类是使用manage.py inspectdb 命令自动创建的。

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

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

谢谢。

【问题讨论】:

  • 您可以使用 Django 的 model_to_dict 来获取 dict 中的模型数据,然后将 dict 转换为列表/数组。 from django.forms.models import model_to_dict, model_to_dict(instance, fields=['myRow',( + 您要包含的其他字段)]
  • 我试过了,model_to_dict 返回了一个空字典。存储在字段中的数据是二进制编码的。这个函数现在应该怎么做 什么是键或值?
  • 它应该返回一个以字段名/对象为键、字段值作为其值的字典。如果您有多个字段,它会返回一个 multiplekeydict。如果应该返回的字段中有数据,请尝试没有字段列表的代码,请参阅文档docs.djangoproject.com/en/1.8/_modules/django/forms/models。第二种选择是过滤,它也返回一个类似的字典 models_to_dict; filters_dict =myTable.objects.values('myRow')
  • 从 django.forms.models 导入 model_to_dict,在视图中; instance = myTable(),打印 model_to_dict(instance),返回 {u'myRow': ..fieldcontent}

标签: python arrays django oracle blob


【解决方案1】:

我通过在 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)

【讨论】:

    猜你喜欢
    • 2013-11-08
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多