OdooV8 - 为什么在我的案例

时间:2017-05-17 10:05:23

标签: python methods odoo odoo-8

我最近开始使用odoo8开发,但我遇到了一个问题。

我的问题是我有两个类:'helpdesk''res_partner'我不知道为什么我的代码在创建时会长时间停留'res_partner'中的新记录但是当我评论这段代码(下面)时,我的代码效果很好。

self.env['res.partner'].create({
    'name': nameFmt,
    'firstname': self.firstNameOfUser.strip().lower().title(),
    'lastname': self.lastNameOfUser.strip().upper(),
    'birthdate': newDateFmt,
    'birth_place': self.pBirthOfUser,
    'is_company': False
})

'helpdesk'类有几个字段和方法来获取信息,并根据用户输入计算它们。一旦计算出信息,我就创建了我的记录,这是一个新的合作伙伴。

我是如何解决我的问题的,我:

  • 在shell模式下使用'--debug'选项启动odoo,并在代码被卡住的pdb中停留(正如我所说,它停留在'create'方法)

  • 阅读有关我的问题的一些主题和文档,但大多数都在v7中用于 create 方法,并且任何人都像这样被创建了一个记录

  • 选中我发送的每个值以创建我的新记录

  • 看到记录的行为以及如何使用phpPgAdmin存储它们

有关详细信息,这是我的整个方法定义:

@api.one
def addPartnerInDB(self):
    if (not self.firstNameOfUser or
        not self.lastNameOfUser or
        not self.dobOfUser or
        not self.pBirthOfUser):
        raise ValidationError(u"Tous les champs sp\u00E9cifi\u00E9s pour "
                              u"cette demande doivent \u00EAtre remplis !")
    # Avoid concurrent drop-down
    self.dropDownList1 = False
    self.dropDownList3 = False
    # Get every partners
    listOfPartners = self.env['res.partner'].search(
        [
            ('is_company', '=', False)
        ]
    )
    # Avoid useless compute for each iteration
    newDateFmt = u"".join(datetime.datetime\
                          .strptime(str(self.dobOfUser), "%Y-%m-%d")\
                          .strftime("%d/%m/%Y"))
    newFNameFmt = self.firstNameOfUser.strip().replace(" ", "-").lower()
    newLNameFmt = self.lastNameOfUser.strip().replace(" ", "-").lower()
    newBPFmt = self.pBirthOfUser.strip().replace(" ", "-").lower()
    matchedPartners = []
    # Fetch partner specified by the user
    for p in listOfPartners:
        if (newFNameFmt == p.firstname.strip().replace(" ", "-").lower() and
            newLNameFmt == p.lastname.strip().replace(" ", "-").lower()):
            matchedPartners.append(p)
    partnerAlreadyExist = False
    # If the list is not empty, then the fetch is enhance
    if (matchedPartners):
        for m in matchedPartners:
            partnerDOB = False
            partnerBP = False
            if (not isinstance(m.birthdate, bool)):
                if (newDateFmt == m.birthdate):
                    partnerDOB = True
            if (not isinstance(m.birth_place, bool)):
                if ((newBPFmt
                     == m.birth_place.strip().replace(" ", "-").lower())):
                    partnerBP = True
            # If one of them it's true, the user already exist
            if (partnerDOB or partnerBP):
                partnerAlreadyExist = True
                # Avoid useless iteration
                break
    # If the user specified doesn't exist he's created
    if (not partnerAlreadyExist):
        # Encode the string to avoid UnicodeError and further string errors
        nameFmt = (self.lastNameOfUser.strip().upper(),
                   + u" "
                   + self.firstNameOfUser.strip().lower().title())
        self.env['res.partner'].create(
            {
                'name': nameFmt,
                'firstname': self.firstNameOfUser.strip().lower().title(),
                'lastname': self.lastNameOfUser.strip().upper(),
                'birthdate': newDateFmt,
                'birth_place': self.pBirthOfUser,
                'is_company': False
            }
        )
    else:
        raise ValidationError(u"L'utilisateur renseign\u00E9 "
                              u"existe d\u00E9j\u00E0 !")

修改

在尝试使用pdb调试我的代码之后,我发现当我比较firstnames和lastnames时, for 语句出了问题:

for p in listOfPartners:
    if (newFNameFmt == p.firstname.strip().replace(" ", "-").lower()
            and newLNameFmt == p.lastname.strip().replace(" ", "-").lower()):
       # Append element

实际上,pdb阻止了(语句的每次启动时间为2/3秒),然后才能给我回传。

例如:

(pdb) ->if (newFNameFmt == p.firstname.strip().replace(" ", "-").lower() and # stuck 2-3 seconds (pdb) -> newLNameFmt == p.lastname.strip().replace(" ", "-").lower()):

对于 for 语句的第一次迭代,此行为仍在继续,在此迭代次数之后,其余迭代不再采用此行为。一旦我到达 create 语句(使用pdb),创建记录就会奇迹般地解锁并且代码可以正常工作。

我仍然不知道为什么会出现这个问题,我仍然不知道如何解决它。

2 个答案:

答案 0 :(得分:1)

你遇到了这个问题,因为你可能比较了2种不同的类型!在您的情况下,您可能尝试在res_partner对象和字符串类型之间进行比较!那应该是res.partner(2973,)。id或res.partner(2973,)。name ....

答案 1 :(得分:1)

我已经找到了我的问题的答案,我想知道问题的来源。

  

我的问题在哪里

所以问题来自我的第一个for声明:     

   listOfPartners = self.env['res.partner'].search(
        [
            ('is_company', '=', False)
        ]
    )

    for p in listOfPartners:
        if (newFNameFmt == p.firstname.strip().replace(" ", "-").lower()
             and newLNameFmt == p.lastname.strip().replace(" ", "-").lower()):
            matchedPartners.append(p)

从理论上讲,forsearch语句没有任何问题,因为它们是我想做的。但问题是程序在此for中执行的每次迭代都是' n'发送到PostgresSQL服务器的查询(其中n对应于每次迭代中使用p的时间。在我的情况下n = 2)。这个问题很快就升级了,因为search让我回复了大约一千个合作伙伴(由id中与res.partner查询相匹配的每条记录的search表示。所以在for中,这对应于我在很短的时间内发送到PostgreSQL服务器的数千个查询,看起来这个服务器无法在很短的时间内处理这么多的请求。 / p>

所以问题不在于他自己的代码,而在于我给他的行为。对于我将通过Odoo提供的进一步查询,该行为的结果为PostgreSQL提供了另一种行为,例如create

  

我是如何解决的

我的解决方案是使用psycopg2模块。该模块允许与postgreSQL服务器通信。在我的情况下,两者之间的主要区别在于Odoo与PostgreSQL服务器保持通信,即使我使用search来获取我想要的值。虽然psycopg2给了我listtuples)只包含"真实"值而不是像Odoo这样的id给了我search

再一次,我不知道我选择的解决方案是否是最好的,或者问题是否就像我上面提到的那样,但这个解决方案对我很有用,我希望它能帮助其他用户停留在同样行为的问题。