当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?

Posted

技术标签:

【中文标题】当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?【英文标题】:Where should one place the code to autoincrement a sharded counter on Google App Engine/Django when one creates a new model? 【发布时间】:2010-11-25 23:26:01 【问题描述】:

我有一个模型 MyModel(扩展 Google 的 db.Model),我想跟踪已创建的模型数量。

我认为来自 Google I/O talk on Sharding Counters 的代码非常好,所以我正在使用它。但是我不确定在创建新代码时应该在哪里调用增量。 (我使用的是 Django,我已经将熟悉的 models.py、views.py 等布局保留到项目的应用程序中。)

对于将递增代码放在哪里,我想到了几种可能性:

    重载 Model.put() 以便在第一次保存模型时递增计数器,同样重载 Model.delete() 以递减计数器

    将某种侦听器附加到保存/删除,并检查保存是否属于新模型(GAE 是否有此类侦听器?)

    将计数器递增代码放入view.py中创建/删除模型的函数中

我非常乐意就如何做到最好(以及每个选项的优缺点)提出建议和想法。

感谢您的阅读。

最好, 布赖恩

【问题讨论】:

您可以使用 Datastore Statistics API,而不是保留已创建模型的计数器吗? code.google.com/appengine/docs/python/datastore/stats.html 【参考方案1】:

我建议“App Engine Fan”here(本质上是“设置场景”)特别是here(显示正确的解决方案:不是“猴子补丁”)建议的方法(奇怪地接近“面向方面的编程”) ”,而是使用 App Engine 架构完善的内置“钩子”工具)。

他作为示例给出的两个“黑客”与您的用例非常接近,您应该可以毫无困难地实现您的代码——事实上,它与您考虑的子点 (2) 的“监听器”解决方案并没有那么远,只是更笼统一些,因为“钩子”实际上可以“干扰”操作(不是您在这里需要)以及能够在操作本身之前或之后运行(在您的情况下,我怀疑“之后”可能会更好,以防万一 put 以某种方式失败,在这种情况下,我想您不想计算它)。

【讨论】:

有人知道我们什么时候可以从 java 访问 hook api 吗?

以上是关于当一个人创建一个新模型时,应该在哪里放置代码以在 Google App Engine/Django 上自动增加一个分片计数器?的主要内容,如果未能解决你的问题,请参考以下文章

更改报价 xcode 6 [关闭]

在哪里放置代码以在 Vue.js 中设置 Firebase 身份验证状态持久性?

创建类时我应该在哪里放置new / delete

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?

Django使用不完整的模型创建一个有效的ModelForm,以在表单验证后手动添加字段

我在哪里放置函数 SetModel 的 mdl 文件