【问题标题】:How to save a dictionary with key having value of type object如何使用具有对象类型值的键保存字典
【发布时间】:2019-06-28 01:54:18
【问题描述】:

我正在尝试使用 pymongo 在 mongodb 中保存一个对象。我正在调用一个 api,它给了我和对象,通过迭代对象,我能够获取字段和值。但问题是可能有一些字段的值也是一个对象,当我尝试将这些字段存储在 mongodb 中时,我遇到了错误。

错误是文档必须是 dict、bson.son.SON、bson.raw_bson.RawBSONDocument 的实例,或者是从 collections.MutableMapping 继承的类型

models.py

class UnusedResources(Document):
    field1 = fields.StringField(max_length=20)
    field2 = fields.DictField()

python 外壳

object = API   #calling api
d = dict()

d['field1'] = None
d['field2'] = object.__dict__  #converted all fields of object into dict and stored in d['field2']

client = MongoClient('127.0.0.1', 27017)
db = client.CESdatabase
collection = db.registration_unusedresources
collection.insert_one(d)

对象内的字段

{
 'additional_properties': {}, 
 'id': '/subscriptions/XXX/resourceGroups/auth-user-api/providers/Microsoft.Network/loadBalancers/XXX', 
 'name': 'XXX',  
 'sku': <azure.mgmt.network.v2018_11_01.models.load_balancer_sku_py3.LoadBalancerSku object at 0x0000000004E05D30>,
 'probes': [<azure.mgmt.network.v2018_11_01.models.probe_py3.Probe object at 0x0000000004E05DA0>], 
 'inbound_nat_rules': [], 
 'inbound_nat_pools': [], 
 'outbound_rules': None
}

【问题讨论】:

  • 变量 'object' 的类型是什么?你能发布一个来自 API 的响应示例吗?
  • d = dict()d['field2'] = d的目的是什么?你是否递归地将字典分配给它的键?这是一个有效的 Python 表达式,但您的数据库可能不支持它。
  • @Chiefir 抱歉,这是我的错误,我试图将对象内的所有字段存储到 d['filed2']
  • 原来我是这么说的?
  • @VamsiKrishnaB api 返回一个对象,通过这样做object.__dict__ 我得到一个对象内的所有字段,例如

标签: django python-3.x pymongo mongoengine


【解决方案1】:

您的 API 响应中有 azure.mgmt.network.v2018_11_01.models.load_balancer_sku_py3.LoadBalancerSkuazure.mgmt.network.v2018_11_01.models.probe_py3.Probe 的实例。这是 Mongo 无法存储的(正确的)。您还需要确定如何对它们进行序列化。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 2016-11-13
    相关资源
    最近更新 更多