1

我一直在做噩梦,试图让 MongoDB 与 Django 一起工作。我现在已成功安装它,但在第一次尝试保存对象时出错。我一直在关注本教程,他们提供的 Post 模型是我精确复制的。

这是模型的代码:

from django.db import models
from djangotoolbox.fields import ListField

class Post(models.Model):
    title = models.CharField(max_length=200)
    text = models.TextField()
    tags = ListField()
    comments = ListField()

该帖子实际上是在此处创建(并插入)的:

post = Post.objects.create(
...     title='Hello MongoDB!',
...     text='Just wanted to drop a note from Django. Cya!',
...     tags=['mongodb', 'django'],
...     comments=['comment 1', 'comment 2']
... ) 

完整的堆栈跟踪可以在这里找到。错误本身是:

InvalidDocument: documents must have only string keys, key was <django.db.models.fields.CharField object at 0x22cae50>

显然 MongoDB 正在运行,因为它希望键是字符串而不是整数。但是为什么朗姆酒不见了?呃,为什么标准的 Django 对象不能保存到 MongoDB 数据库中?

我添加了被忽略的必需的 CharField 参数 max_length。在这种情况下它不起作用,如果我也删除列表也不起作用。

4

4 回答 4

1

在将 django-mongodb-engine 库更新到 github 存储库的“开发”分支中的当前版本之前,我收到了这个错误。只需使用所示文章中的说明即可导入主分支。

于 2012-07-16T10:15:45.680 回答
1

我也遵循了本教程并遇到了同样的错误。我设法解决了这个问题。我做错的是我使用了来自 github(https://github.com/django-nonrel/djangotoolbox)存储库的 djangotoolbox,它是 0.9.2 版。然后我删除了它并按照教程状态进行操作,并使用了 djangotoolbox 版本 0.9.1 上的bitbucket ( https://bitbucket.org/wkornewald/djangotoolbox )。现在它工作正常。

于 2012-09-03T19:29:18.947 回答
0

在我看来,你的模型看起来还不错。这个错误很有趣;它是说您称为“标题”的属性的键只能是字符串,但如果我没记错的话,这里的字符串是键“标题”,值是 CharField() 字段,一起表示 MongoDB 中 Post 文档中的键/值对。尝试通过跳入 django shell 来隔离问题:

python manage.py shell

并从头开始构建您的 Post 对象。使用dragonx提到的模型。最好简单地调试这些问题。如果您在尝试为 Post 对象 p 调用 Post.objects.create(p) 或调用 p.save() 时遇到相同的错误,请尝试重新编写 Post 模型并再试一次。

最后,您可以向我们展示您的 settings.py 文件并查看您的 mongodb 设置。如果您说您正在使用 django-nonrel,那么您可以进行基本检查以确保 python、django 和 mongodb 相互通信。

让我们知道您的情况。

于 2012-06-11T19:02:02.017 回答
0

这是否有效:

post = Post(
...     title='Hello MongoDB!',
...     text='Just wanted to drop a note from Django. Cya!',
...     tags=['mongodb', 'django'],
...     comments=['comment 1', 'comment 2']
... ) 

另一件事要尝试:

class Post(models.Model):
    title = models.CharField(primary_key=True, max_length=200)

我认为默认情况下 Django 使用自动生成的数值作为主键。这将迫使您的标题成为您的主键......它是一个字符字符串,因此它可能会解决您看到的问题。这只是一个猜测,因为您看到的实际错误对我来说没有太大意义。

于 2012-04-16T00:48:04.943 回答