首页 > 解决方案 > Odoo 13:通过创建功能创建多条记录

问题描述

这是我在 Odoo13 中编写的第一个创建函数。我想得到两个日期begin_dateend_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'

要么我不能在这个问题上使用自我,要么退货有问题

标签: pythondateodoorecordodoo-13

解决方案


由于self是一个空记录集,self.employ_id将被评估为False并且 Odoo 不会执行 if 语句,然后将返回默认值None

您可以使用val 列表调用super(不返回结果),但这会改变 create 方法的行为,它应该从.vals

您可以使用向导来创建project.timeoff记录。


推荐阅读