如何获取单个记录而不是记录集
How to get single record instead of recordset
我正在尝试弄清楚如何告诉我的模块显示网站中给定产品(模板)的唯一可能(由于给定 _sql_constraint
)相关 tag
Odoo 中的(电子商务产品页面)。
鉴于下面的模型,(显然我需要说)一旦有多个合作伙伴为特定产品设置了标签,我就会收到 Expected singleton: woa.website.sale.partner.product.tag(1, 2, 3, ...)
错误。但是,我无法理解如何获取某个产品(即用户当前正在查看的产品页面)与合作伙伴本身(即当前登录网站的用户)之间的关系。
型号:
class WoaWebsiteSalePartnerProductTag(models.Model):
_name = "woa.website.sale.partner.product.tag"
_description = "Allow partners to tag products individually for easier search and reference"
product_id = fields.Many2one('product.template', string='Product', required=True)
partner_id = fields.Many2one('res.partner', string='Customer', required=True)
company_id = fields.Many2one('res.company', string='Company', required=False, default=lambda self: self.env.user.company_id)
tag = fields.Char(string='Product tag given by the partner', required=True, default=False)
_sql_constraints = [
('unique_code', 'unique(product_id, partner_id, company_id)',
'You can define only one tag per product.'),
]
class WoaProductTemplate(models.Model):
_inherit = "product.template"
woa_website_sale_partner_product_tag_product_ids = fields.One2many('woa.website.sale.partner.product.tag', 'product_id')
class WoaPartnerTemplate(models.Model):
_inherit = "res.partner"
woa_website_sale_partner_product_tag_partner_ids = fields.One2many('woa.website.sale.partner.product.tag', 'partner_id')
查看:
<template id="woa_website_sale_partner_product_tag.product" inherit_id="website_sale.product">
<xpath expr="//div[@id='product_details']" position="after">
<div class="col-md-6 col-xl-4 offset-xl-2" id="woa_website_sale_partner_product_tag.product.tag">
<t t-if="request.env.user.active == True">
<b>Your reference for this product:</b>
<t t-if="product.woa_website_sale_partner_product_tag_product_ids.partner_id.id == request.env.user.partner_id.id">
<span t-field="product.woa_website_sale_partner_product_tag_product_ids.tag"/>
</t>
</t>
</div>
</xpath>
</template>
我很确定这就是 @api.one
和一些实际定义产品与合作伙伴之间关系的好方法的用武之地,但我不明白这种方法应该是什么样子并实际在模板中调用。
错误信息:
Error to render compiling AST
ValueError: Expected singleton: woa.website.sale.partner.product.tag(5, 6)
Template: 1492
Path: /templates/t/t[4]/div/section/div[2]/div[3]/t[1]
Node: <t t-if="product.woa_website_sale_partner_product_tag_product_ids.partner_id.id == request.env.user.partner_id.id">
<span t-field="product.woa_website_sale_partner_product_tag_product_ids.tag"/>
</t>
一个计算字段(如下所示)执行 search()
和 return 我正在寻找的一条记录可能是要走的路:
partner_product_tag = fields.Char('woa.website.sale.partner.product.tag', compute='partner_product_tag', store=False)
@api.one
def partner_product_tag(self):
partner_product_tag = request.env['woa.website.sale.partner.product.tag'].search([('product_id', '=', self.product_id), ('partner_id', '=', self.partner_id), ('company_id', '=', self.company_id)])
return partner_product_tag
但是,我应该如何将它放入我的模块中,相关模板部分应该是什么样子?
显然,使用计算字段是的方法。
此外,我认为值得一提的是 return
从计算方法中获取并不是一个好主意,因为它实际上不会返回所需的值,self.woa_website_sale_partner_product_tag = ...
但是会。
所以我的工作 WoaProduct
class 现在看起来像这样:
class WoaProduct(models.Model):
_inherit = "product.template"
woa_website_sale_partner_product_tag_product_ids = fields.One2many('woa.website.sale.partner.product.tag', 'product_id')
woa_website_sale_partner_product_tag = fields.Char('woa.website.sale.partner.product.tag', compute='_partner_product_tag', store=False)
@api.one
def _partner_product_tag(self):
user = self.env.user
product_id = int(self.id)
partner_id = user.partner_id.id
company_id = user.company_id.id
#return woa_website_sale_partner_product_tag ## DON'T!
self.woa_website_sale_partner_product_tag = http.request.env['woa.website.sale.partner.product.tag'].search([('product_id', '=', product_id), ('partner_id', '=', partner_id), ('company_id', '=', company_id)]).tag ## DO THIS INSTEAD
... 相关模板如下所示:
<template id="woa_website_sale_partner_product_tag.product" inherit_id="website_sale.product">
<xpath expr="//div[@id='product_details']" position="after">
<div class="col-md-6 col-xl-4 offset-xl-2" id="woa_website_sale_partner_product_tag.product.tag">
<t t-if="request.env.user.active == True">
<b>Your reference for this product:</b>
<t t-if="product.woa_website_sale_partner_product_tag">
<span t-field="product.woa_website_sale_partner_product_tag"/>
</t>
</t>
</div>
</xpath>
</template>
我正在尝试弄清楚如何告诉我的模块显示网站中给定产品(模板)的唯一可能(由于给定 _sql_constraint
)相关 tag
Odoo 中的(电子商务产品页面)。
鉴于下面的模型,(显然我需要说)一旦有多个合作伙伴为特定产品设置了标签,我就会收到 Expected singleton: woa.website.sale.partner.product.tag(1, 2, 3, ...)
错误。但是,我无法理解如何获取某个产品(即用户当前正在查看的产品页面)与合作伙伴本身(即当前登录网站的用户)之间的关系。
型号:
class WoaWebsiteSalePartnerProductTag(models.Model):
_name = "woa.website.sale.partner.product.tag"
_description = "Allow partners to tag products individually for easier search and reference"
product_id = fields.Many2one('product.template', string='Product', required=True)
partner_id = fields.Many2one('res.partner', string='Customer', required=True)
company_id = fields.Many2one('res.company', string='Company', required=False, default=lambda self: self.env.user.company_id)
tag = fields.Char(string='Product tag given by the partner', required=True, default=False)
_sql_constraints = [
('unique_code', 'unique(product_id, partner_id, company_id)',
'You can define only one tag per product.'),
]
class WoaProductTemplate(models.Model):
_inherit = "product.template"
woa_website_sale_partner_product_tag_product_ids = fields.One2many('woa.website.sale.partner.product.tag', 'product_id')
class WoaPartnerTemplate(models.Model):
_inherit = "res.partner"
woa_website_sale_partner_product_tag_partner_ids = fields.One2many('woa.website.sale.partner.product.tag', 'partner_id')
查看:
<template id="woa_website_sale_partner_product_tag.product" inherit_id="website_sale.product">
<xpath expr="//div[@id='product_details']" position="after">
<div class="col-md-6 col-xl-4 offset-xl-2" id="woa_website_sale_partner_product_tag.product.tag">
<t t-if="request.env.user.active == True">
<b>Your reference for this product:</b>
<t t-if="product.woa_website_sale_partner_product_tag_product_ids.partner_id.id == request.env.user.partner_id.id">
<span t-field="product.woa_website_sale_partner_product_tag_product_ids.tag"/>
</t>
</t>
</div>
</xpath>
</template>
我很确定这就是 @api.one
和一些实际定义产品与合作伙伴之间关系的好方法的用武之地,但我不明白这种方法应该是什么样子并实际在模板中调用。
错误信息:
Error to render compiling AST
ValueError: Expected singleton: woa.website.sale.partner.product.tag(5, 6)
Template: 1492
Path: /templates/t/t[4]/div/section/div[2]/div[3]/t[1]
Node: <t t-if="product.woa_website_sale_partner_product_tag_product_ids.partner_id.id == request.env.user.partner_id.id">
<span t-field="product.woa_website_sale_partner_product_tag_product_ids.tag"/>
</t>
一个计算字段(如下所示)执行 search()
和 return 我正在寻找的一条记录可能是要走的路:
partner_product_tag = fields.Char('woa.website.sale.partner.product.tag', compute='partner_product_tag', store=False)
@api.one
def partner_product_tag(self):
partner_product_tag = request.env['woa.website.sale.partner.product.tag'].search([('product_id', '=', self.product_id), ('partner_id', '=', self.partner_id), ('company_id', '=', self.company_id)])
return partner_product_tag
但是,我应该如何将它放入我的模块中,相关模板部分应该是什么样子?
显然,使用计算字段是的方法。
此外,我认为值得一提的是 return
从计算方法中获取并不是一个好主意,因为它实际上不会返回所需的值,self.woa_website_sale_partner_product_tag = ...
但是会。
所以我的工作 WoaProduct
class 现在看起来像这样:
class WoaProduct(models.Model):
_inherit = "product.template"
woa_website_sale_partner_product_tag_product_ids = fields.One2many('woa.website.sale.partner.product.tag', 'product_id')
woa_website_sale_partner_product_tag = fields.Char('woa.website.sale.partner.product.tag', compute='_partner_product_tag', store=False)
@api.one
def _partner_product_tag(self):
user = self.env.user
product_id = int(self.id)
partner_id = user.partner_id.id
company_id = user.company_id.id
#return woa_website_sale_partner_product_tag ## DON'T!
self.woa_website_sale_partner_product_tag = http.request.env['woa.website.sale.partner.product.tag'].search([('product_id', '=', product_id), ('partner_id', '=', partner_id), ('company_id', '=', company_id)]).tag ## DO THIS INSTEAD
... 相关模板如下所示:
<template id="woa_website_sale_partner_product_tag.product" inherit_id="website_sale.product">
<xpath expr="//div[@id='product_details']" position="after">
<div class="col-md-6 col-xl-4 offset-xl-2" id="woa_website_sale_partner_product_tag.product.tag">
<t t-if="request.env.user.active == True">
<b>Your reference for this product:</b>
<t t-if="product.woa_website_sale_partner_product_tag">
<span t-field="product.woa_website_sale_partner_product_tag"/>
</t>
</t>
</div>
</xpath>
</template>