【问题标题】:How to use mongoengine in the form of xxx[dbname?]如何以xxx[dbname?]的形式使用mongoengine
【发布时间】:2016-04-07 01:57:36
【问题描述】:

通过使用 pymongo,我可以像这样连接到一个集合:

conn = pymongo.MongoClient()
db = conn.example
collection = db.col

然后,我可以连接到名为“example”的数据库和名为“col”的集合。

而且我还可以编写像这样的代码:

dbname = 'example'
collectionName = 'col'
conn = pymongo.MongoClient()
db = conn[dbname]
connection = db[collectionName]

这两个代码块会做同样的事情。

现在,我使用 mongoengine 连接到 MongoDB,并且我有一个带有 collectionA 的数据库,我还有一个名为 'model.py' 的文件中的类:

class collectionA(Document):
    A=StringField()
    B= StringField()

所以我只能使用:

import model
x = model.collectionA.object()

查询数据。

因为我有这么多收藏,所以我想用

model[collectionName].object() 

查询数据,但是抛出异常,mongoengine好像不支持model[xxx]的形式连接集合。

那么,有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您是否尝试过import appname.model,其中appname 是您的应用名称,然后model['collectionName'].object()?另外,您使用model[collectionName].object() 会遇到什么错误
  • 应用名称?这是一个python脚本。
  • 把它误认为是 Django 应用程序,因为您在 Django 中使用模型。你遇到了什么错误?
  • 其实这是flask,不是Django。错误是: TypeError: 'module' object has no attribute 'getitem'

标签: python mongodb mongoengine


【解决方案1】:

您正在将 model.py 作为模块导入。方括号语法是对象上getitem 方法的“快捷方式”。 Because everything in python is an object,包括模块,你会得到一个TypeError,因为模块没有getitem 方法。

您想要实现的目标可以使用inspect 模块完成:

import inspect

import model

collections = dict(inspect.getmembers(model, inspect.isclass))

collections[collectionName].object() 现在可以工作了。

FWIW 这似乎不是很pythonic,而 mongoengine 的强大之处在于您将文档映射到明确定义的类,这似乎有点混淆了这一点。它可以很容易地引入难以发现的错误,并且还需要额外的击键,因为现在每个类都被引用为字符串。

【讨论】:

  • 非常感谢,我稍后会尝试。那么根据您的经验,在这种情况下,什么是更 Pythonic 的方式?
  • 您在问题中提出的方式对我来说很好。要保存击键,您可以使用import models as db,然后使用db.CollectionA.objects ()。这样做的一个主要优点是,如果您使用像 PyCharm 这样的带有代码检查功能的 IDE,那么您将从您的 model.py 中获得自动完成选项
猜你喜欢
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2016-09-14
  • 2020-12-20
  • 2020-10-18
  • 2013-10-15
相关资源
最近更新 更多