我最近开始使用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),创建记录就会奇迹般地解锁并且代码可以正常工作。
我仍然不知道为什么会出现这个问题,我仍然不知道如何解决它。
答案 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)
从理论上讲,for
和search
语句没有任何问题,因为它们是我想做的。但问题是程序在此for
中执行的每次迭代都是' n'发送到PostgresSQL服务器的查询(其中n
对应于每次迭代中使用p
的时间。在我的情况下n
= 2)。这个问题很快就升级了,因为search
让我回复了大约一千个合作伙伴(由id
中与res.partner
查询相匹配的每条记录的search
表示。所以在for
中,这对应于我在很短的时间内发送到PostgreSQL服务器的数千个查询,看起来这个服务器无法在很短的时间内处理这么多的请求。 / p>
所以问题不在于他自己的代码,而在于我给他的行为。对于我将通过Odoo提供的进一步查询,该行为的结果为PostgreSQL提供了另一种行为,例如create
。
我是如何解决的
我的解决方案是使用psycopg2模块。该模块允许与postgreSQL服务器通信。在我的情况下,两者之间的主要区别在于Odoo与PostgreSQL服务器保持通信,即使我使用search
来获取我想要的值。虽然psycopg2
给了我list
(tuples
)只包含"真实"值而不是像Odoo这样的id
给了我search
。
再一次,我不知道我选择的解决方案是否是最好的,或者问题是否就像我上面提到的那样,但这个解决方案对我很有用,我希望它能帮助其他用户停留在同样行为的问题。