Odoo 10: Как вставить значение в поле many2one в таблице с помощью метода create? [Дубликат]

1

мое поле many2one в models.py:

commercial_group = fields.Many2one("simcard.simcard")

Я хочу добавить новое значение в это поле many2one, используя метод create. Это значение, которое я получаю из SOAP-ответа, который я разбору использует с помощью дерева элементов:

response=requests.post(self.url,cert=self.cert,data=body,headers=self.headers) 
 element = ElementTree.fromstring(response.content.decode('utf-8'))
 body_el = element.find('{schemas.xmlsoap.org/soap/envelope}Body') 
 commercial_group=body_el.find('{example.com}commercialGroup')

И я хочу создать новую запись с этим полем commercialGroup и некоторыми другими полями:

record.sudo().create({
                                     "icc": icc.text,
                                     "imsi": imsi.text,
                                     "msisdn": msisdn.text,
                                     "lte_status": lte_status.text,
                                     "life_cycle_status": life_cycle_status.text,
                                     "sim_model": simmodel.text,
                                     "gprs_status": gprsStatus.text,

                                     "consumption_monthly_data_limit": consumption_monthly_data_limit.text,
                                     "consumption_monthly_data_value": consumption_monthly_data_value.text,
                                     "consumption_monthly_data_thrReached": consumption_monthly_data_thrReached.text,

                                     "commercial_group": commercial_group.text,

                                     "country": country.text,
                                     "operator": operator.text

                                       })
              http.request.env.cr.commit()

и я получаю эту ошибку:

INFO test odoo.sql_db: bad query: INSERT INTO "simcard_simcard" ("id", "consumption_monthly_data_limit", "consumption_monthly_data_thrReached", "msisdn", "country", "lte_status", "consumption_monthly_data_value", "life_cycle_status", "icc", "gprs_status", "sim_model", "operator", "commercial_group", "imsi", "create_uid", "write_uid", "create_date", "write_date") VALUES(nextval('simcard_simcard_id_seq'), '0', '0', '34590169', 'CH', 'false', '0', 'ACTIVE', '89293165951', '2', 'M2M Plug-in', 're', '1GB_dynPool_Plus_LTE', '29782', 1, 1, (now() at time zone 'UTC'), (now() at time zone 'UTC')) RETURNING id
2018-09-19 13:44:27,441 5714 ERROR test odoo.http: Exception during JSON request handling.
Traceback (most recent call last):
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 642, in _handle_exception
    return super(JsonRequest, self)._handle_exception(exception)
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 684, in dispatch
    result = self._call_function(**self.params)
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 334, in _call_function
    return checked_call(self.db, *args, **kwargs)
  File "/Users/anubhavjhalani/odoo10/odoo/service/model.py", line 101, in wrapper
    return f(dbname, *args, **kwargs)
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 327, in checked_call
    result = self.endpoint(*a, **kw)
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 942, in __call__
    return self.method(*args, **kw)
  File "/Users/anubhavjhalani/odoo10/odoo/http.py", line 507, in response_wrap
    response = f(*args, **kw)
  File "/Users/anubhavjhalani/odoo10/addons/web/controllers/main.py", line 895, in call_kw
    return self._call_kw(model, method, args, kwargs)
  File "/Users/anubhavjhalani/odoo10/addons/web/controllers/main.py", line 887, in _call_kw
    return call_kw(request.env[model], method, args, kwargs)
  File "/Users/anubhavjhalani/odoo10/odoo/api.py", line 689, in call_kw
    return call_kw_multi(method, model, args, kwargs)
  File "/Users/anubhavjhalani/odoo10/odoo/api.py", line 680, in call_kw_multi
    result = method(recs, *args, **kwargs)
  File "/Users/anubhavjhalani/odoo10/addons/simcard/models/models.py", line 259, in sync
    parse.parseXml(subscriptionDatas)
  File "/Users/anubhavjhalani/odoo10/addons/simcard/models/parse.py", line 71, in parseXml
    "operator": operator.text
  File "/Users/anubhavjhalani/odoo10/odoo/models.py", line 3846, in create
    record = self.browse(self._create(old_vals))
  File "/Users/anubhavjhalani/odoo10/odoo/models.py", line 3941, in _create
    cr.execute(query, tuple(u[2] for u in updates if len(u) > 2))
  File "/Users/anubhavjhalani/odoo10/odoo/sql_db.py", line 154, in wrapper
    return f(self, *args, **kwargs)
  File "/Users/anubhavjhalani/odoo10/odoo/sql_db.py", line 231, in execute
    res = self._obj.execute(query, params)
DataError: invalid input syntax for integer: "1GB_dynPool_Plus_LTE"

                                                             ^

Каков правильный способ вставки значения в поле many2one в таблице с помощью метода create?

Теги:
odoo
relational-database
oncreate

1 ответ

1
Лучший ответ

Твой путь в порядке. Вы значения словаря имеет значение для целочисленного поля, которое, очевидно, получает не целое значение (1GB_dynPool_Plus_LTE). Таким образом, у вас либо есть неправильное значение для этого поля, либо полевое определение неверно, или вам нужно проанализировать свое значение на целое число, например, посредством сопоставления.

Редактировать:

Ваше поле commercial_group является отношением many2one к модели simcard.simcard. Я не знаю определения для этой модели, поэтому буду считать следующее:

class Simcard(models.Model):
    _name = "simcard.simcard"

    name = fields.Char()

Теперь о создании Odoo нужны идентификаторы или ничего для многих других полей. Поэтому либо вы ищете существующую запись для этой модели, либо создаете ее, либо просто пустите ее. В моем следующем примере используется сочетание. Сначала я буду искать, и если ничего не найдено, мой пример кода создаст simcard.simcard запись и позже ее использует.

commercial_group_name = commercial_group.text
simcard = record.env['simcard.simcard'].search(
    [('name', '=', commercial_group_name)], limit=1)
if not simcard:
    simcard = record.env['simcard.simcard'].create(
        {'name': commercial_group_name})
record.sudo().create({
    # other values
    "commercial_group": simcard.id,
    # other values
})
  • 0
    одна вещь, я уверен, что у меня нет неправильного значения. 1GB_dynPool_Plus_LTE должен идти в Commercial_group. Что будет правильным определением поля для моего поля, когда я хочу увидеть выпадающее меню в графическом интерфейсе? И к какому целому числу я должен сопоставить свою ценность? Извините, я новичок в odoo.
  • 0
    Не могли бы вы добавить свои определения полей в свой вопрос?
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню