通常,您不应尝试覆盖Model类的 init
方法。尽管可能会正确,但正确的构造函数行为相当复杂,甚至在发行版之间可能会更改,从而破坏了代码(尽管我们尽量避免这样做!)。造成这种情况的部分原因是,您自己的代码,构造新模型和框架都必须使用构造函数,以重构从数据存储中加载的模型。
更好的方法是使用工厂方法,而不是构造方法调用。
另外,您可能想在编写实体的同时而不是在创建时添加任务。如果不这样做,最终会导致竞争:在将新实体存储到数据存储区之前,任务可能会执行!
这是建议的重构:
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)


