标题:
身体: 我在 Odoo 模块中有代码,在
update
表上有两个连续的 SQL gym_membership
语句。第一个将合格成员资格的状态更新为“已确认”,第二个将不同组的状态设置为“草稿”。我想澄清他们的执行和潜在冲突。
代码:
self.env.cr.execute("UPDATE gym_membership SET state = 'confirmed' WHERE id IN (SELECT gym_membership_id FROM sale_order WHERE gym_membership_id IN (SELECT id FROM gym_membership WHERE state = 'finished' AND is_sessions_generated = False AND membership_type IN ('class','private')))")
self.env.cr.execute("UPDATE gym_membership SET state = 'draft' WHERE state = 'finished' AND is_sessions_generated = False AND membership_type IN ('class','private')")
澄清:
在您的示例中它是相同的光标,因此将执行第一个查询,然后执行下一个查询,依此类推。已经是连续的了
因为是同一个游标,所以不应该发生冲突,因为第二个查询的数据状态已经是第一个查询之后的状态。因此,第二个查询可能会更新第一个查询已经更新的数据,但这就是顺序执行查询的方式。
尽可能避免 SQL 查询,因为您完全绕过了 Odoo 的安全功能。通常只有 Odoo 生成的非常糟糕的查询才应该使用它们进行优化,即使如此,也只能在尝试优化表本身之后(例如通过特殊的索引)。
尽可能使用 ORM。举个例子:
# first query in ORM
sale_domain = [
("gym_membership_id.state", "=", "finished"),
("gym_membership_id.is_sessions_generated", "=", False),
("gym_membership_id.membership_type", "in", ("class", "private")),
]
memberships_sale = self.env["sale.order"].search(sale_domain).mapped("gym_membership_id")
memberships_sale.write({"state": "confirmed"})
# second query in ORM
membership_domain = [
("state", "=", "finished"),
("is_sessions_generated", "=", False),
("membership_type", "in", ("class", "private")),
]
memberships = self.env["gym.membership"].search(membership_domain))
memberships.write({"state": "draft"})