Как получить одну запись вместо набора записей - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь выяснить, как заставить мой модуль отображать только один из возможных (из-за заданного _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() и возвращает ту запись, которую я ищу, вероятно, есть путь:

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

Но как я должен поместить это в мой модуль и что будет соответствующий шаблонраздел чем выглядит?

1 Ответ

0 голосов
/ 22 февраля 2019

Очевидно, использование вычисленного поля - это способ.

Кроме того, я думаю, что стоит упомянуть, что return использование метода вычисления не является хорошей идеей, поскольку оно выиграло 't фактически возвращает желаемое значение, однако self.woa_website_sale_partner_product_tag = ... делает.

Так что мой рабочий класс WoaProduct теперь выглядит так:

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>
...