def payment_state(self): for record in self: record.state = 'payment' if record.state == 'payment': database_dict = { "code": record.code, 'name': self._description } self.env['roke.receipt.details'].create(database_dict) 这个怎么修改可用同时添加多条数据
时间: 2024-02-10 10:11:24 浏览: 92
你可以尝试将代码改为以下形式:
```
def payment_state(self):
details = []
for record in self:
record.state = 'payment'
if record.state == 'payment':
database_dict = {
"code": record.code,
'name': self._description
}
details.append(database_dict)
self.env['roke.receipt.details'].create(details)
```
这里我们先创建一个空列表`details`,然后遍历每个记录,将状态设置为 "payment",并将相应的字典添加到 `details` 列表中。最后,我们一次性创建所有的记录,而不是每次循环都创建一条记录。这样可以提高效率,同时可以添加多条数据。
相关问题
给下列代码加注释: def merge_accumulate_client_update(self, list_num_proc, list_state_dict, lr): total_num_proc = sum(list_num_proc) # merged_state_dict = dict() dict_keys = list_state_dict[0].keys() for state_dict in list_state_dict[1:]: assert state_dict.keys() == dict_keys # accumulate extra sgrad and remove from state_dict if self.use_adaptive and self.is_adj_round(): prefix = "extra." for state_dict in list_state_dict: del_list = [] for key, param in state_dict.items(): if key[:len(prefix)] == prefix: sgrad_key = key[len(prefix):] mask_0 = self.model.get_mask_by_name(sgrad_key) == 0. dense_sgrad = torch.zeros_like(mask_0, dtype=torch.float) dense_sgrad.masked_scatter_(mask_0, param) # no need to divide by lr self.control.accumulate(sgrad_key, dense_sgrad) del_list.append(key) for del_key in del_list: del state_dict[del_key]
```python
def merge_accumulate_client_update(self, list_num_proc, list_state_dict, lr):
total_num_proc = sum(list_num_proc)
# merged_state_dict = dict()
dict_keys = list_state_dict[0].keys()
# Check if all state dicts have the same keys
for state_dict in list_state_dict[1:]:
assert state_dict.keys() == dict_keys
# accumulate extra sgrad and remove from state_dict
if self.use_adaptive and self.is_adj_round():
prefix = "extra."
for state_dict in list_state_dict:
del_list = []
for key, param in state_dict.items():
# Check if the key starts with 'extra.'
if key[:len(prefix)] == prefix:
# Get the corresponding sgrad key
sgrad_key = key[len(prefix):]
# Create a mask of zeroes
mask_0 = self.model.get_mask_by_name(sgrad_key) == 0.
# Create a dense tensor and fill it with values from param based on the mask
dense_sgrad = torch.zeros_like(mask_0, dtype=torch.float)
dense_sgrad.masked_scatter_(mask_0, param)
# Accumulate the dense sgrad without dividing by lr
self.control.accumulate(sgrad_key, dense_sgrad)
# Add the key to the delete list
del_list.append(key)
# Remove the keys from the state_dict
for del_key in del_list:
del state_dict[del_key]
```
这段代码实现了一个`merge_accumulate_client_update`方法,主要功能是合并和累加`list_state_dict`中的状态字典。以下是对代码的注释:
- `total_num_proc`:所有进程数的总和。
- `dict_keys`:状态字典的键列表。
- 检查所有状态字典是否具有相同的键。
- 如果使用自适应且处于调整轮次,则累加额外的`sgrad`并从状态字典中删除。
- `prefix`:额外`sgrad`的前缀。
- 对于每个状态字典,遍历键和参数。
- 如果键以`prefix`开头,则获取相应的`sgrad`键。
- 创建一个零填充的掩码。
- 创建一个稠密张量,并根据掩码从参数中填充值。
- 累加不除以`lr`的稠密`sgrad`。
- 将键添加到删除列表。
- 从状态字典中删除键。
def action_confirm(self): if not self.outbound_line: raise UserError('请录入出库明细!') for record in self.outbound_line: if record.quantity < record.available_inventory: database_dict = { "available_inventory": record.available_inventory - record.quantity } outbound = self.env['roke.warehouse.statistics'].search([('code', '=', record.code.id)]) outbound.write(database_dict) else: raise UserError('当前数量大于库存数量!') self.warehouse_state = 'confirm'这个在另一个表中没有数据
如果在 `roke.warehouse.statistics` 表中没有符合搜索条件的记录,则 `search()` 方法将返回空记录集,因此在尝试访问空记录集时会引发异常。您需要在执行 `write()` 操作之前检查是否存在符合条件的记录,如果没有,则需要进行相应的处理,例如创建新的记录或引发警告。
下面是一个可能的解决方案:
```
def action_confirm(self):
if not self.outbound_line:
raise UserError('请录入出库明细!')
for record in self.outbound_line:
if record.quantity < record.available_inventory:
database_dict = {
"available_inventory": record.available_inventory - record.quantity
}
# 检查是否存在符合条件的记录
outbound = self.env['roke.warehouse.statistics'].search([('code', '=', record.code.id)])
if outbound:
outbound.write(database_dict)
else:
# 如果不存在符合条件的记录,可以选择创建新的记录或引发警告
# 例如:
# self.env['roke.warehouse.statistics'].create({
# 'code': record.code.id,
# 'available_inventory': record.available_inventory - record.quantity
# })
raise UserError('找不到符合条件的记录!')
else:
raise UserError('当前数量大于库存数量!')
self.warehouse_state = 'confirm'
```
在上面的示例中,如果没有符合条件的记录,代码将引发一个警告,您也可以选择使用 `create()` 方法创建一个新的记录。请根据您的实际需求进行相应的处理。
阅读全文