【问题标题】:Is there a way to check for new objects/entries in a Django database?有没有办法检查 Django 数据库中的新对象/条目?
【发布时间】:2013-10-21 14:22:46
【问题描述】:

我正在 Tornado 中编写一个与 HTML5 WebSockets 配合使用的 Python 服务器。我的服务器通过 JavaScript 创建与客户端浏览器的连接来工作。创建连接后,它会保持打开状态,直到浏览器(或服务器将其关闭)。我需要定期检查我的模型之一是否已更改或数据库是否已更新。

这里的代码示例来说明我的意思:

>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
150
>>> # Some stuff happens on the client and the model is changed, one more entry is added
>>> mymodels = MyModel.objects.all()
>>> len(mymodels)
151

这一切都发生在服务器应用程序中,模型的更改将发生在服务器脚本运行的一个“会话”中。无论如何我可以检查新对象或刷新我的 Django 数据库吗?

如果我的意思仍然不清楚,请举例说明:假设我有一个名为 MyModel 的模型。首次运行服务器脚本时,它有 150 个不同的条目或数据库行。我从客户端与服务器建立 WebSocket 连接,并请求在发生新更改时更新我。在我的客户端的其他地方,其他一些用户做了一些事情,在我的数据库中为 MyModel 类创建了一个新行。我的服务器虽然仍然保持与原始客户端的相同连接,但需要能够在不停止执行的情况下检测到该更改。

定期检查不是问题,它实际上确保 Django 数据库 API 知道新添加的信息。无论如何我可以确保发生这种情况吗? 原来贴的示例代码实际上并不起作用。无论我在模型中添加多少项,MyModel.objects.all() 的长度仍然是 150。如果我重新启动我的 Django shell,它会更新计数。

我尝试过的其他一些事情:

  • 使用内置的 reload() 函数重新加载模型模块。
  • 为特定的 MyModel 集过滤模型
  • 使用原始 SQL 查询来选择所有内容并根据特定条件进行过滤

无论我对数据库进行多少更改,所有这些方法都会返回相同数量的 MyModel 对象。有趣的是,在 MySQL Workbench 中运行原始 SQL 会产生预期的结果。

【问题讨论】:

  • 可以在指定的时间间隔发出ajax请求,并检查count的变化,如果count不一样则刷新
  • Django 没有“数据库”,它的模型调用只是对数据库的 SQL 调用的包装。您的数据库服务器可以通过 2 种方式告诉您是否发生了更改:轮询数据库以获取更改(这会消耗大量时间和资源)——或者使用一些数据库队列机制(通常在 Java 中,但也可以附加到 python 进程)。
  • 你的脚本是多线程的吗?您是否考虑过实现预保存或保存后挂钩?
  • 你的服务器脚本具体在做什么?
  • 对不起,含糊不清,我已经更新了我的帖子。谢谢您的帮助。问题不在于长轮询或使用 AJAX。它只是在长时间运行的脚本的同一执行中检查数据库中的更新。

标签: python database django django-models reload


【解决方案1】:

我想通了! 强制 Django 更新其数据库引用的最简单方法是关闭数据库连接。 Django 会根据需要自动创建一个新的。

django.db.close_connection()

如果您在关闭连接之前需要提交更改,这将完成与上述相同的操作,但保留您所做的更改。 (即您不需要关闭连接,因为无论如何这都会刷新数据库)

django.db.connection._commit()

感谢您的 cmets,祝您有美好的一天!

【讨论】:

    【解决方案2】:

    如果这一切都在服务器端脚本运行的一个“会话”中,也许你已经在一个数据库事务中运行了整个事情(这意味着没有其他人可以看到它)——尽管事实上你可以在 Workbench 中逐渐看到它们建议不要。话虽如此,值得检查一下您对交易的处理方式。

    另外,您是否阅读了this 以确保 Django 正在做您认为它正在做的事情?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 2014-11-14
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多