Python TypeError:+;的操作数类型不受支持:';非类型';和';非类型

Python TypeError:+;的操作数类型不受支持:';非类型';和';非类型,python,odoo,nonetype,Python,Odoo,Nonetype,我是Python的新用户,我对None类型有一个问题,我看了不同的问题,但问题仍然存在 我的代码查找两个日期之间的星期五和星期六,到目前为止它是有效的,但当我将这两个日期相加时,我有一个错误: “TypeError:不支持+:'NoneType'和'NoneType'的操作数类型” 在我返回函数中的结果之后 这是我的代码: # -*- coding: utf-8 -*- import datetime import calendar calendar.setfirstweekday(c

我是Python的新用户,我对
None
类型有一个问题,我看了不同的问题,但问题仍然存在

我的代码查找两个日期之间的星期五和星期六,到目前为止它是有效的,但当我将这两个日期相加时,我有一个错误:

“TypeError:不支持+:'NoneType'和'NoneType'的操作数类型”

在我返回函数中的结果之后

这是我的代码:

    # -*- coding: utf-8 -*-

import datetime
import calendar
calendar.setfirstweekday(calendar.SUNDAY)

from odoo import models, fields, api

class HrMission(models.Model):
    _name = "hr.employee.mission"
    _description = "hr mission"
    _inherit = "hr.employee.mission"

    days_compensation =fields.Float(compute='get_compensation', compstring='Jours de récupération', help="Jours de récupération si la mission contient les jours de repos",
                             required=True, readonly=True,)

    @api.multi
    @api.depends('mission_start_date', 'mission_end_date')
    def get_compensation(self):
        for rec in self:
            if rec.mission_start_date and rec.mission_end_date:
                time1 = datetime.datetime.strptime(rec.mission_start_date, "%Y-%m-%d")
                time2 = datetime.datetime.strptime(rec.mission_end_date, "%Y-%m-%d")
                week = {}
                leave_value = {}
        # Compute Number Of Friday And Saturday
                for i in range((time2 - time1).days):
                    day = calendar.day_name[(time1 + datetime.timedelta(days=i+1)).weekday()]
                    week[day] = week[day] + 1 if day in week else 1                    
                fri = week.get('Friday')  # Result Number 4 Of Friday If "Start Date", "End date" --> "01/01/2017", "31/01/2017"
                sat = week.get('Saturday') # Same thing that friday
                friandsat = mon + sat # Error ---> "TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'"
                rec.days_compensation = friandsat

我已经使用了您的代码。这似乎有点效果。它可以计算出一周中某个日期范围内存在的天数。当您的日期范围内既没有星期五也没有星期六时,就会出现问题(请注意,您有一个名为“mon”的变量,该变量是通过查找键“fride”设置的)

因此,您的问题似乎只是您必须考虑到这样的情况,即您提供的输入日期范围内没有一周中的这两天。在这种情况下,week.get('Friday')和week.get('Saturday')中的一天或两天在你的地图中不存在,因此周一和/或周六,你将遇到问题

为了让代码运行,我在下面添加了以下内容:

class Rec:
    def __init__(self, start, end):
        self.mission_start_date = start
        self.mission_end_date = end

self = [
    Rec("2019-3-31", "2019-4-1")
]

get_compensation(self)
这让我可以让你的代码处理一对日期。如果我在这里给出的日期范围包括星期五和星期六,那么你的代码运行正常。否则,它会吐出你所说的错误

如果更改行:

mon = week.get('Friday')
sat = week.get('Saturday')
致:

那么你的代码在我测试的任何日期范围内都不会崩溃。我不知道它是否在计算你想要的结果,因为你没有保留或返回任何计算结果。

  • 需要注意的一点是,开始日期和结束日期是否都包含在日期范围内。例如,如果两个日期都是
    datetime.datetime(2019,3,1)
    ,那么答案应该是
    1
上述代码将假定日期范围包含在内。删除
+1
使其不包含在内。如果不包括星期五或星期六,则将
天\u补偿
字段设置为0

  • 请注意,不需要在数据类型之间来回转换,因为
    datetime
    中的日历日枚举和
    weekday
    函数都计算为可比较的整数

  • 另一件事是,根据

默认情况下不存储计算字段,它们会在请求时计算并返回。设置store=True将它们存储在数据库中并自动启用搜索

因此,您可能需要:

days_compensation = fields.Float(compute='get_compensation', compstring='Jours de récupération', help="Jours de récupération si la mission contient les jours de repos", required=True, readonly=True,
store=True)

请注意,唯一的更新是
store=True

我认为您可以使用
datetime
格式返回两个日期之间的星期五和星期六。仅此而已。还有一个检查日期名称是否为所需名称的条件


此格式打印日期名称:
%A“

这是为从搜索引擎来到这里的人准备的我在导入数据时遇到此错误。之所以发生此错误,是因为我将产品id字段映射到了
product
,而不是
product/External id
。因此,如果您在导入数据时遇到此错误,请检查id字段是否正确映射。

能否向我们显示您遇到的错误,以及显示错误发生位置的stacktrace?如果您正在谈论通过调用此方法获得的结果求和,那么我打赌你的问题是这个方法没有返回值。-我不清楚你应该返回什么值。我知道,这就是问题所在,我想返回星期五和星期六的值,但它不是类型,请帮助我。很抱歉我刚刚注意到你在代码中的评论。从您的代码中,我不清楚您如何假设这一周将同时包含星期五和星期六这两个键。您需要提供一个更完整的示例。我们可以运行的东西,包括导致您看到的问题的示例数据/输入。对不起,我的意思是“星期五”而不是“我的”。它不是两个变量“fri”和“sat”的总和。请帮帮我,我已经花了好几个小时了,但我还没有解决这个问题。我知道你想做什么。我认为有很多方法可以解决这个问题。但是你可以做的一件事是检查星期六的钥匙是否在你的周记中。如果没有,那么你数了0个星期六。星期五也一样。您可以做的一件事是初始化地图,使地图以每天的一个条目开始,每个条目出现0次。那么现在出错的代码就可以工作了,因为周['Saturday']总是有一个值。我认为如果您将两个关键行更改为
fri=week,您的代码可能会工作。如果周中的'Friday'为0
,则获取('Friday'),星期六也是如此。我更新了我的答案,以包括我刚才在这里所说的内容。这似乎解决了你的问题。谢谢你^^,比我提到的问题,是删除,但函数不返回任何结论,即我的值始终为零,可以在日历的导入中,不!总是相同的东西不返回,当我选择两个日期时,
days\u compensation
字段总是
null
...
def get_compensation(self):
    def date_range_inclusive(rec):
        # if either date is undefined, then so is date range
        if not rec.mission_end_date or not rec.mission_start_date:
            return iter([])

        # Add 1 for inclusivity of both start and end dates
        num_days = abs((rec.mission_end_date - rec.mission_start_date).days) + 1
        return (rec.mission_start_date + timedelta(days=n) for n in range(num_days))

    for rec in self:
        # date range, including both start and end dates
        dates = date_range_inclusive(rec)
        # desired days to count
        day_selection = (calendar.FRIDAY, calendar.SATURDAY)

        rec.days_compensation = sum([dt.weekday() in day_selection for dt in dates])
days_compensation = fields.Float(compute='get_compensation', compstring='Jours de récupération', help="Jours de récupération si la mission contient les jours de repos", required=True, readonly=True,
store=True)