【问题标题】:Querying with mongoengine and django使用 mongoengine 和 django 进行查询
【发布时间】:2012-05-14 11:28:46
【问题描述】:

我有一个数据库“tumblelog”(使用 mongoengine),我在其中使用“用户”模型在“用户”集合中添加了一些数据:

db.user.find()

...
{ "_id" : ObjectId("4fb0c9494ca88402dd000000"), "_types" : [ "User" ], "first_name" : "John", "last_name" : "Doe", "_cls" : "User", "email" : "jdoe@example.com" }
{ "_id" : ObjectId("4fb0cb9d4ca88402ec000000"), "_types" : [ "User" ], "first_name" : "Joe30", "last_name" : "Foe", "_cls" : "User", "email" : "hu@huu.com" }

当我在 django shell 中尝试 User.objects 时,我收到以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File ".../mongoengine/queryset.py", line 1127, in __getitem__
     return self._document._from_son(self._cursor[key])
  File ".../mongoengine/base.py", line 1018, in _from_son
     obj = cls(**data)
  TypeError: __init__() keywords must be strings

我尝试时也是这样

for user in User.objects:
    print user.first_name

---- 编辑----

我试过了

>>> users = User.objects
>>> users.count()
7
>>> users.first()
...
TypeError: __init__() keywords must be strings

---- 编辑 2 ----

我以这种方式安装了我的项目:

> virtualenv Test
> source Test/bin/activate
> pip install Django
> pip install mongoengine
> cd Test/
> django-admin.py startproject db

然后我添加了行

from mongoengine import *
connect('tumblelog')

在 settings.py 中 然后我创建了这个简单的模型

from mongoengine import *

class User(Document):
email = StringField(required=True)
name = StringField(max_length=50)

然后我运行服务器

> python manage.py runserver

在 shell (python manage.py shell) 中,如果我导入我的模型类但我无法读取它,我可以保存数据,我总是有相同的 TypeError: init() 关键字必须是字符串!

-----切换到 django-mongodb 引擎----

我没有找到任何解决方案,所以我将使用 django-mongodb-engine。我没有找到任何比较,但我尝试了两者并且非常相似。 我只是后悔 django-mongodb-engine 没有处理继承原则。

我做错了什么? 提前致谢!

【问题讨论】:

  • 是循环出错还是打印行出错?
  • 您能提供示例数据吗? data 字典中有什么内容?
  • 我在这个简单的项目中遇到了错误(使用 virtualenv,没有 sql 并且全新安装了最后一个 django 和 mongoengine):mediafire.com/?9d00eitagggueui

标签: django mongoengine


【解决方案1】:

我们在使用 mongoengine 0.6.9 时遇到了完全相同的问题。我并不是建议这是一个理想的解决方案,但降级到 0.6.5 为我们解决了这个问题。

【讨论】:

  • 我想要一个测试用例/一些示例数据,因为我无法复制它。
  • 我在这个简单的项目中有错误:mediafire.com/?1iejsf3g3pyzc11
  • 一个更好的例子(使用 virtualenv,没有 sql 和最新的 django 和 mongoengine 的全新安装):mediafire.com/?9d00eitagggueui
  • 您有没有想过尝试使用Django MongoDB connector 来代替?它的作用是将原始的 Django ORM 连接到 MongoDB,这意味着您可以获得 Django ORM 的所有功能
【解决方案2】:

使用 all() 方法

for user in User.objects.all():
    print user.first_name

【讨论】:

  • User.objects.all() 有效。告诉我使用 objects.all() 时显示的错误
  • 还有users.first()??你想派生所有用户的名字,不是吗? users.objects 是一个默认模型管理器,它没有方法 first()。所以很明显 users.first() 不会工作。尝试 .all() 并告诉我它显示了什么错误。你一定犯了一些愚蠢的错误。
  • 你可以参考这个进行查询。并检查语法docs.djangoproject.com/en/dev/topics/db/queries
  • 我正在使用 mongoengine(或者我尝试使用)readthedocs.org/docs/mongoengine-odm/en/latest/… 有一个 first() 函数:检索与查询匹配的第一个对象。问题是我总是得到“TypeError:__init__() 关键字必须是字符串”,无论我尝试 User.objects 或 User.objects.all()
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多