通常,您不应尝试覆盖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)