是否可以检查Django数据库中的新对象/条目?

问题描述 投票:-1回答:2

我正在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会产生预期的结果。

python database django django-models reload
2个回答
1
投票

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

django.db.close_connection()

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

django.db.connection._commit()

感谢您的评论,祝您有愉快的一天!


0
投票

如果全部都在服务器端脚本运行的一个“会话”中,也许您已经在一个数据库事务中运行了全部内容(这意味着其他任何东西都看不到)-尽管您可以看到这一事实他们在Workbench中逐步建议不要这样做。话虽如此,值得检查一下您在进行哪些交易。

而且,您是否已阅读this以确保Django正在执行您认为正在做的事情?

© www.soinside.com 2019 - 2024. All rights reserved.