python - Odoo 13:通过创建功能创建多条记录
问题描述
这是我在 Odoo13 中编写的第一个创建函数。我想得到两个日期begin_date和end_date之间的时间段,日期应该保存在一个列表中。从这个列表中,我想为列表中的每一天为单个员工创建记录。但我的代码似乎不正确,我得到了这种错误: AttributeError: 'NoneType' object has no attribute 'id'
这是我的代码:
from datetime import timedelta, datetime, date
from calendar import monthrange
from odoo import api, fields, models, tools
from odoo.exceptions import UserError, AccessError, ValidationError
from odoo.tools import date_utils
class TimeOff(models.Model):
_name = 'project.timeoff'
_rec_name = 'employ_id'
employ_id = fields.Many2one('hr.employee', string='Employee', required='1')
date = fields.Date('Date', required=True, index=True,
default=fields.Date.context_today)
begin_date = fields.Datetime(
'First Day of Leave', required='1')
day_hours = fields.Integer('Off hours per day', default='8', required='1')
end_date = fields.Datetime(
'Last Day of Leave')
###### create function #######
@api.model
def create(self, vals):
range_date = [] # empty list
if self.employ_id: # check if field has value
if self.begin_date and self.end_date: # check if field has value
range_date = self.calc_dates(
self.begin_date, self.end_date, mode='date') # call custom function and expect a list to be returned
if range_date is None:
raise ValidationError("Something went wrong") # list is empty
else: # iterate through list and create record for each date
for day in range_date:
vals = {
'employ_id': self.employ_id,
'begin_date': day}
return super(TimeOff, self).create(vals)
### custom function to get all dates between begin_date and end_date #####
def calc_dates(self, date1, date2, mode='date'):
date_from = fields.Date.from_string(date1)
date_to = fields.Date.from_string(date2)
delta = date_to - date_from
if delta.days < 0:
return None
dates = []
for n in range(delta.days + 1):
if mode == 'date': # returns dates as date format
dates.append(date_from + timedelta(days=n))
if mode == 'string': # returns dates as string format
dates.append(fields.Date.to_string(
date_from + timedelta(days=n)))
return dates
所以当我按下创建时,我得到了这个错误:
Error:
Odoo Server Error
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/odoo/http.py", line 624, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 310, in _handle_exception
raise pycompat.reraise(type(exception), exception, sys.exc_info()[2])
File "/usr/lib/python3/dist-packages/odoo/tools/pycompat.py", line 14, in reraise
raise value
File "/usr/lib/python3/dist-packages/odoo/http.py", line 669, in dispatch
result = self._call_function(**self.params)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 350, in _call_function
return checked_call(self.db, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/service/model.py", line 94, in wrapper
return f(dbname, *args, **kwargs)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 339, in checked_call
result = self.endpoint(*a, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 915, in __call__
return self.method(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/http.py", line 515, in response_wrap
response = f(*args, **kw)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1327, in call_kw
return self._call_kw(model, method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/addons/web/controllers/main.py", line 1319, in _call_kw
return call_kw(request.env[model], method, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 385, in call_kw
result = _call_kw_model_create(method, model, args, kwargs)
File "/usr/lib/python3/dist-packages/odoo/api.py", line 366, in _call_kw_model_create
return result.id if isinstance(args[0], Mapping) else result.ids
AttributeError: 'NoneType' object has no attribute 'id'
要么我不能在这个问题上使用自我,要么退货有问题
解决方案
由于self
是一个空记录集,self.employ_id
将被评估为False
并且 Odoo 不会执行 if 语句,然后将返回默认值None
。
您可以使用val 列表调用super
(不返回结果),但这会改变 create 方法的行为,它应该从.vals
您可以使用向导来创建project.timeoff
记录。
推荐阅读
- unix - Jenkins、Ubuntu 节点和从属构建未能将项目保存到临时文件夹
- jetty - 有没有办法通过浏览器访问码头服务器日志?
- vue.js - 开发时是否可以在 Vue 中跟踪源样式定义(sass、scss)?
- android - 所有活动的相同工具栏 - 我缺少的东西
- django - Django 模板和版本
- javascript - 如何为 reactjs 配置媒体资产和字体的 webpack
- laravel - 获取除 created_at 和 updated_at 列之外的所有列
- react-native - 无法在本机反应中将arraylist传递给本机模块库
- ruby - Shopify 自定义运输脚本 - 删除特定产品的运费
- javascript - 使用 morris.js 从图表上的网格中删除标签文本