gpt4 book ai didi

python - ndb.transactional 如何对实体进行分组?

转载 作者:行者123 更新时间:2023-11-30 23:31:21 25 4
gpt4 key购买 nike

此应用程序用于租赁服务。分发工具时,我需要将客户 key 保存在工具的“who_has”属性上,并将工具 key 添加到分发订单中。如果出现任何问题,我需要删除所有以前写入的“who_has”属性。

我认为 Transcastions 是做到这一点的方法。这是我的代码

def get_tools(tool_ids):
tools =[]
for t in tool_ids:
tool = classes.ToolUnits.get_by_id(int(t))
tools.append(tool)

return tools

@ndb.transactional(xg=True)
def process_handout(self):
customer_id = self.request.get("customer")
tool_ids = self.request.get("units")

if not customer_id == 'false' and (not tool_ids=="[]" or not tool_ids):
customer = classes.Customers.get_by_id(int(customer_id))

order = classes.Orders(
customer = customer.key,
handout = True,
transferred = [],
booked = [],
)

tools = get_tools(json.loads(tool_ids))

for tool in tools:

if not tool.who_has:
tool.who_has = customer.key
order.transferred.append(tool.key)
tool.put()
else:
# if tool is already taken
order.booked.append(tool.key)

order.put()
self.redirect('/order/%s' % order.key.id())
else:
self.redirect('/tools')

两个工具都可以正常工作,但 8 个工具会抛出错误:BadRequestError:在单个事务中对太多实体组进行操作。

显然,每个 tool.put() 都被视为一个实体组。我如何将它们联合到一个组中?

我尝试过文档,但对我来说都是中文的。你能解释一下我的例子吗?

最佳答案

您正在使用跨组 (xg=True) 交易,即 limited to 5 entities participating in the transaction

实体组由 ancestor path 定义:这仅仅意味着对于特定实体(或多个实体),您定义父实体,并且对于该父实体,您可以再次定义父实体,基本上定义实体树。所有这些实体都属于同一实体组。组的根是树根处的实体:其他实体(直接或间接)定义为父实体的实体,但它本身没有定义父实体。

如果您没有定义实体的父实体,并且也不使用该实体作为其他实体的父实体,则该实体是它自己的实体组的根。

简化的基本原理:实体组基本上意味着“将所有实体放在同一台机器上”,以便 GAE 可以轻松地对它们进行事务更改。

限制是实体组(=实体组内的所有实体)每秒只能更新一次。因此,您需要小心如何构建数据。一种好的方法是使用用户作为实体组的根,因为用户行为独立并且往往不会在很短的时间内创建多个请求。

希望这能澄清一些问题。

关于python - ndb.transactional 如何对实体进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19995742/

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