Odoo в методе write() проверяет отношение many2many

У меня есть 2 класса:

class my_request(models.Model):

    _name = 'my.request'
    _inherit = ['mail.thread', 'ir.needaction_mixin']

    supply_ids  = fields.Many2many(comodel_name='supply.conditions',
                                              relation='purchase_supply_rel',
                                              column1='purchase_requests_id', column2='supply_conditions_id',
                                              string='Supply Conditions')

и

class SupplyConditions(models.Model):
    _name = 'supply.conditions'

vendor = fields.Char(string='Vendor', required=True)
quantity = fields.Char(string='Quantity', required=True)
request_id = fields.Many2one('my.request', 'My request')
name = fields.Many2one('my.request.line', string='Product', required=True)
currency_id = fields.Many2one('res.currency', string='Currency', default=_get_default_currency)
supply_rel_id = fields.Boolean(string='Relation field', default=False)

Часть класса my.request представления формы xml:

<page string="Order">
      <field name="supply_ids" domain="[('purchase_id', '=', id)]"/>
</page>

Когда я выбираю значения из представления формы my.request и нажимаю кнопку «Сохранить», я вызываю метод write() и в это время вставляю значения m2m (если есть выбранные значения) в реляционную таблицу (purchase_supply_rel).

Я хочу добавить проверку, находится ли идентификатор Purchase.request в таблице Purchase_supply_rel в поле Purchase_requests_id, когда я нажимаю кнопку Сохранить. Моя функция. Изменения после # моего нового кода:

@api.multi
def write(self, vals):
    res = super(PurchaseRequest, self).write(vals)
    for request in self:
        if request.state != 'draft':
        if vals.get('assigned_to'):
            self.message_subscribe_users(user_ids=[request.assigned_to.id])
    # my new code
    test = self.env['purchase.request'].search([(self.id,'in','supply_ids')])
    _logger.warning("test " + str(test));
    return res

Но я получил ошибку:

  File "/opt/odoo/openerp/osv/expression.py", line 586, in check_leaf
    raise ValueError("Invalid leaf %s" % str(self.leaf))
ValueError: Invalid leaf (348, 'in', 'supply_ids')

Как еще я могу это проверить? И что я делаю не так?

ОБНОВЛЕНИЕ:

Мне нужно получить тестовое значение примерно так: Purchase_request(245,352) 245,352 - идентификаторы класса Purchase.request


person fueggit    schedule 15.06.2017    source источник


Ответы (1)


Вы не можете добавить динамическое значение в домен вместо имени поля. Домен представляет собой список кортежей. Домен содержит три части в кортеже.

Домен:

[('field_name','operator','values')]

Таким образом, динамическое значение не разрешено в имени поля в домене.

@api.multi
def write(self, vals):
    res = super(PurchaseRequest, self).write(vals)
    for request in self:
        if request.state != 'draft':
        if vals.get('assigned_to'):
            self.message_subscribe_users(user_ids=[request.assigned_to.id])
    # my new code
    test = self.env['purchase.request'].search([('supply_ids','in',self.ids)])
    _logger.warning("test " + str(test));
    return res
person Emipro Technologies Pvt. Ltd.    schedule 15.06.2017
comment
Спасибо. После изменения я не получаю сообщения об ошибке, но что-то все еще не так. Проблема в том, что когда я вызываю метод write(), тестовое значение у меня пустое: Purchase.request() хотя есть данные в реляционной таблице (purchase_supply_rel). Поэтому я понятия не имею, как еще я могу проверить, есть ли значение в реляционной таблице... - person fueggit; 16.06.2017
comment
Пожалуйста, поделитесь модельными структурами всех моделей. - person Emipro Technologies Pvt. Ltd.; 16.06.2017
comment
Что именно вы имеете в виду? Вы хотите посмотреть файл инициализации и манифест? Теперь я обновил поля, используемые в Supply.conditions в моем вопросе. - person fueggit; 18.06.2017
comment
Я попробовал другой метод: test = self.supply_ids.ids, если test › 0, то я получаю то, что мне нужно (проверить, находится ли значение в реляционной таблице m2m) - person fueggit; 19.06.2017
comment
о, вы хотите сохранить данные поля M2m в реляционной модели, пока вы сохраняете запись my.request? - person Emipro Technologies Pvt. Ltd.; 19.06.2017
comment
Я хочу проверить, сохранена ли запись my.request в реляционной таблице m2m. - person fueggit; 19.06.2017
comment
обычно поле M2m позаботится об этом по умолчанию. - person Emipro Technologies Pvt. Ltd.; 19.06.2017