您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何正确使用App Engine Python模型类的自定义__init__?

如何正确使用App Engine Python模型类的自定义__init__?

通常,您不应尝试覆盖Model类的 方法。尽管可能会正确,但正确的构造函数行为相当复杂,甚至在发行版之间可能会更改,从而破坏了代码(尽管我们尽量避免这样做!)。造成这种情况的部分原因是,您自己的代码,构造新模型和框架都必须使用构造函数,以重构从数据存储中加载的模型。

更好的方法是使用工厂方法,而不是构造方法调用

另外,您可能想在编写实体的同时而不是在创建时添加任务。如果不这样做,最终会导致竞争:在将新实体存储到数据存储区之前,任务可能会执行!

这是建议的重构:

class DeleteQueueItem(db.Model):
    """Model to keep track of items that will be deleted via task queue."""

    # URL path to the blog post is handled as key_name
    delete_when = db.DateTimeproperty()

    @classmethod
    def new(cls, key_name):
        delay = 120  # Seconds
        t = datetime.timedelta(seconds=delay)
        deadline = datetime.datetime.Now() - t

        return cls(key_name=key_name, delete_when=deadline)

    def put(self, **kwargs):
      def _tx():
        taskqueue.add(url='/admin/task/delete_page', 
                      countdown=delay,
                      params={'path': key_name},
                      transactional=True)
        return super(DeleteQueueItem, self).put(**kwargs)
      if not self.is_saved():
        return db.run_in_transaction(_tx)
      else:
        return super(DeleteQueueItem, self).put(**kwargs)
python 2022/1/1 18:44:07 有300人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶