【问题标题】:Inserts with Mongoengine work only from shell, but not from Django view使用 Mongoengine 的插入只能从 shell 工作,但不能从 Django 视图工作
【发布时间】:2011-07-14 10:50:50
【问题描述】:

我遇到了奇怪的情况——从 Django shell 创建一些 Mongoengine 对象是成功的,但是从 Django 视图创建相同的对象看起来很成功,但 MongoDB 中没有出现任何数据。 IE。相同的代码 -

from myapp.mongomodels import MyModel

m = MyModel(a=1, b=2, c=3)
m.save()

manage.py shell 运行时生成插入到 MongoDB 中的新对象,从 Django 视图运行时不生成任何内容。我已经跟踪了代码,我看到mongoengine.Document.save() 方法运行正常,没有任何异常。

看起来我错过了一些明显的东西。

将不胜感激。

【问题讨论】:

  • settings 是一样的吗?他们使用的是同一个数据库吗?请提供设置相同的证据。
  • 啊,我好像找到了问题所在。我在保存对象之前为其分配了一个主键值,pymongo 认为这是一个更新,而不是插入。但是,这段代码在 shell 中工作而在 Django 视图中不起作用仍然很奇怪。当我解决问题时会回复。
  • 您应该为您的问题提供这个答案。其他人也会有这个问题。
  • manage.py shell 应该使用与manage.py runserver 相同的设置。我相信设置是相同的,因为我在使用我的测试视图打开网页时看到执行了 MongoDB 更新查询(参数与我从视图中调用的完全相同)。

标签: python django mongodb mongoengine


【解决方案1】:

您应该可以这样做,但使用以下命令强制保存:

from myapp.mongomodels import MyModel

m = MyModel(a=1, b=2, c=3)
m.save(force_insert=True)

【讨论】:

  • 相同的代码如何在 shell 中运行,但在视图中却不行?我遇到了这个问题,但我正在尝试将新文档插入到现有文档的列表中。
  • 天啊。如果您使用引号在 ListField 内的 EmbeddedDocumentField 中引用尚未定义的模型,则会出现此错误。
  • 不确定我是否遵循 - 你能举个例子吗?
【解决方案2】:

正如我之前所说,问题在于我在保存之前分配了一个主键值。

我有一个系统,其中一些数据存储在 MySQL 中,一些相应的数据存储在 MongoDB 中。首先创建 MySQL 记录,在 MySQL 记录之后创建相关的 MongoDB 记录,具有相同的主键值。因此,pymongo 认为这是更新请求而不是插入请求,根本没有插入记录。

【讨论】:

    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2019-08-10
    • 2013-06-30
    相关资源
    最近更新 更多