有没有方法可以检查Django数据库中的新对象/条目?

2024-04-27 00:22:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用Tornado编写一个Python服务器,它可以与HTML5 WebSockets一起工作。我的服务器通过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()函数重新加载models模块。在
  • 为某组MyModel筛选模型
  • 使用原始SQL查询来选择所有内容并根据特定条件进行筛选

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


Tags: thedjango代码模型服务器数据库示例客户机
2条回答

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

django.db.close_connection()

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

django.db.connection._commit()

谢谢你的评论,祝你今天愉快!在

如果这一切都是在服务器端脚本的一个“会话”中运行的,那么也许你已经在一个DB事务中运行了整个事务(这意味着其他人看不到它)——尽管在Workbench中可以增量地看到它们这一事实并不意味着。话虽如此,还是值得检查一下你在做什么交易。在

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

相关问题 更多 >