gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:24:48 24 4
gpt4 key购买 nike

我正在尝试实现延迟删除博客文章的方案。因此,您不会收到烦人的Are you sure?,而是有 2 分钟的时间来取消删除。

我想跟踪使用 db.Model 类 (DeleteQueueItem) 时将删除的内容,因为我发现无法从队列中删除任务,并且怀疑我可以查询其中的内容。

创建 DeleteQueueItem 实体应自动设置 delete_when 属性并将任务添加到队列中。我使用博客文章的相对路径作为它们的 key_name 并希望在此处也将其用作 key_name。这让我想到了一个自定义的 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()

def __init__(self, **kwargs):
delay = 120 # Seconds
t = datetime.timedelta(seconds=delay)
deadline = datetime.datetime.now() - t
key_name = kwargs.get('key_name')

db.Model.__init__(self, **kwargs)
self.delete_when = deadline

taskqueue.add(url='/admin/task/delete_page',
countdown=delay,
params={'path': key_name})

这似乎有效,直到我尝试删除该实体:

fetched_item = models.DeleteQueueItem.get_by_key_name(path)

这失败了:

TypeError: __init__() takes exactly 1 non-keyword argument (2 given)

我做错了什么?

最佳答案

通常,您不应该尝试覆盖模型类的 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)

关于python - 如何正确使用 App Engine Python 模型类的自定义 __init__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com