Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有办法检查Django数据库中的新对象/条目?_Python_Database_Django_Django Models_Reload - Fatal编程技术网

Python 有没有办法检查Django数据库中的新对象/条目?

Python 有没有办法检查Django数据库中的新对象/条目?,python,database,django,django-models,reload,Python,Database,Django,Django Models,Reload,我正在用Tornado编写一个Python服务器,它与HTML5WebSocket一起工作。我的服务器通过JavaScript与客户端浏览器建立连接。一旦创建了连接,它将保持打开状态,直到浏览器(或服务器将其关闭)。我需要定期检查我的一个模型是否已更改或数据库是否已更新 下面的代码示例演示了我的意思: >>> mymodels = MyModel.objects.all() >>> len(mymodels) 150 >>> # Some s

我正在用Tornado编写一个Python服务器,它与HTML5WebSocket一起工作。我的服务器通过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会产生预期的结果。

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

django.db.close_连接()

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

django.db.connection.\u commit()

谢谢你的评论,祝你度过愉快的一天

如果这一切都在服务器端脚本运行的一个“会话”内,那么可能整个事情都在一个DB事务中运行(这意味着其他任何人都看不到它)——尽管您可以在Workbench中以增量方式看到它们的事实表明并非如此。话虽如此,还是有必要检查一下您对事务所做的操作


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

您可以在指定的时间间隔发出ajax请求,检查计数的变化,并刷新计数。如果计数不是sameDjango没有“数据库”,它的模型调用只是围绕对数据库的SQL调用的包装。数据库服务器有两种方法可以告诉您是否发生了更改:轮询数据库以进行更改(这会消耗大量时间和资源),或者使用一些数据库队列机制(通常使用Java,但可以连接到python进程)。您的脚本是多线程的吗?你有没有考虑过实现一个pre或post保存钩子?你的服务器脚本具体在做什么?很抱歉,我已经更新了我的帖子。谢谢你的帮助。问题不在于长轮询或使用AJAX。它只是在长时间运行的脚本的同一执行过程中检查数据库中的更新。