有没有办法“刷新”当前加载的Django数据库,以便检查是否添加了我的模型的新条目/对象?
EDIT3 :(我想出来了!请参阅下面的答案)
原始信息:
这是一个代码示例,用于演示我的意思:
>>> 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数据库吗?
感谢您的帮助!
编辑:根据您的初步评论,我的问题显然不够详细。对于那个很抱歉。这里有更多信息:
我正在Tornado中编写一个与HTML5 WebSockets配合使用的Python服务器。我的服务器通过JavaScript创建与客户端浏览器的连接。创建连接后,它将保持打开状态,直到浏览器(或服务器关闭它)。我需要定期检查我的某个模型是否已更改,或者数据库是否已更新。
我的意思的一个例子,如果它仍然不清楚:假设我有一个名为MyModel的模型。首次运行服务器脚本时,它有150个不同的条目或数据库行。我从我的客户端与我的服务器建立WebSocket连接,并请求在发生新的更改时更新。在我的客户端的其他地方,其他一些用户做了一些事情,在我的数据库中为MyModel类创建了一个新行。我的服务器在保持与原始客户端相同的连接的同时,需要能够在不停止执行的情况下检测到该更改。
定期检查不是问题,它实际上确保Django数据库API知道新添加的信息。无论如何我可以确保发生这种情况吗? 最初发布的示例代码实际上无法正常工作。无论我向模型添加多少项,MyModel.objects.all()的长度仍为150。如果我重新启动我的Django shell,它会更新计数。
我没有在原帖中包含所有这些细节,因为我觉得它们并不相关。 我真的只需要知道如何在同一个长时间运行的脚本中检查我的模型的添加内容。
非常感谢你的帮助。
EDIT2: 我现在尝试过的其他一些事情:
无论我对数据库做了多少更改,所有这些方法都会返回相同数量的MyModel对象。有趣的是,在MySQL Workbench中运行原始SQL会产生预期的结果。
如果你可以帮助我,请告诉我我能做些什么来解决这个问题......
答案 0 :(得分:1)
我想出来了! 强制Django更新其数据库引用的最简单方法是关闭数据库连接。 Django会根据需要自动创建一个新的。
django.db.close_connection()
如果在关闭连接之前需要提交更改,这将完成与上面相同的操作,但保留您所做的更改。 (即您无需关闭连接,因为这会刷新数据库)
django.db.connection._commit()
感谢您的评论并度过愉快的一天!
答案 1 :(得分:0)
如果它都在运行的服务器端脚本的一个“会话”内,也许你已经在一个数据库事务中运行了整个事情(这意味着没有别的东西可以看到它) - 尽管你可以在Workbench中逐步看到它们表明没有。话虽如此,值得查看你在做什么交易。
另外,您是否已阅读this以确保Django正在执行您认为正在执行的操作?