Skip to Content
Meniu
Trebuie să fiți înregistrat pentru a interacționa cu comunitatea.
Această întrebare a fost marcată
3 Răspunsuri
1430 Vizualizări

I am working on a product importing tool, that imports data through XMLRPC into my Odoo 18 database. I am well on the way, except getting the Attribute lines has some mysteries for me.


I have created an product.attribute​and product.attribute.value​, which are are all OK. Now, to connect this to a product, I have to create a product.template.attribute.line​which has an attribute_id​ and an array of value_ids​. So far so good, however, to prevent creating too many items, I first want to check if such a line already exists. To do so, I have now this:


existing_line_ids = self.models.execute_kw(self.database, self.uid, self.apikey, 'product.template.attribute.line', 'search', [[["value_ids","any",[value_id]],["attribute_id", "=", attribute_id]]])


But this gives me an error: 

ValueError: not enough values to unpack (expected 3, got 1)


How can I search for a line that has a specific attribute_id​ and value_id​ set?


PS

This is the complete backtrace of the error:


xmlrpc.client.Fault: <Fault 1: 'Traceback (most recent call last):\n  File "/home/odoo/src/odoo/odoo/addons/base/controllers/rpc.py", line 161, in xmlrpc_2\n    response = self._xmlrpc(service)\n               ^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/addons/base/controllers/rpc.py", line 139, in _xmlrpc\n    result = dispatch_rpc(service, method, params)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/http.py", line 398, in dispatch_rpc\n    return dispatch(method, params)\n           ^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/service/model.py", line 39, in dispatch\n    res = execute_kw(db, uid, *params[3:])\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/service/model.py", line 61, in execute_kw\n    return execute(db, uid, obj, method, *args, **kw or {})\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/service/model.py", line 68, in execute\n    res = execute_cr(cr, uid, obj, method, *args, **kw)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/service/model.py", line 52, in execute_cr\n    result = retrying(partial(odoo.api.call_kw, recs, method, args, kw), env)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/service/model.py", line 137, in retrying\n    result = func()\n             ^^^^^^\n  File "/home/odoo/src/odoo/odoo/api.py", line 517, in call_kw\n    result = getattr(recs, name)(*args, **kwargs)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/models.py", line 1717, in search\n    return self.search_fetch(domain, [], offset=offset, limit=limit, order=order)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/models.py", line 1741, in search_fetch\n    query = self._search(domain, offset=offset, limit=limit, order=order or self._order)\n            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/models.py", line 5754, in _search\n    query = self._where_calc(domain)\n            ^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/models.py", line 5505, in _where_calc\n    return expression.expression(domain, self).query\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/osv/expression.py", line 781, in __init__\n    self.expression = domain_combine_anies(domain, model)\n                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/osv/expression.py", line 599, in domain_combine_anies\n    domain_any = _anyfy_leaves(domain, model)\n                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/osv/expression.py", line 381, in _anyfy_leaves\n    result.append((left, operator, _anyfy_leaves(right, comodel)))\n                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File "/home/odoo/src/odoo/odoo/osv/expression.py", line 366, in _anyfy_leaves\n    left, operator, right = item = tuple(item)\n    ^^^^^^^^^^^^^^^^^^^^^\nValueError: not enough values to unpack (expected 3, got 1)\n'>


Imagine profil
Abandonează
Cel mai bun răspuns

Hii,

Problem in Your Current Domain

This part:


[[ "value_ids" , "any" ,[value_id]],[ "attribute_id" , "=" , attribute_id]]

is incorrect because:

  • The any operator does not exist in Odoo's domain language.
  • Every condition in the domain must be a 3-element tuple/list : [field, operator, value]
Correct Way to Search for attribute_id and value_ids

To search for lines that have a specific attribute_id and one value in value_ids :

[ [ "attribute_id" , "=" , attribute_id], [ "value_ids" , "in" , [value_id]], ]

  • "in" is the valid operator to check whether a value is in a many2many/one2many field.

Full Example

Here's how your XML-RPC call from Java/Python should look:

existing_line_ids = models.execute_kw( db, uid, password, 'product.template.attribute.line' , 'search' , [[ [ 'attribute_id' , '=' , attribute_id], [ 'value_ids' , 'in' , [value_id]] ]] )

This will return all product.template.attribute.line IDs that have:

  • The given attribute_id
  • At least one value_id equal to the one you're checking

i hope it is use fulll

Imagine profil
Abandonează
Cel mai bun răspuns

Hi, please check this: https://youtu.be/Cmbo2iGuTBY 
Hope it helps.

Imagine profil
Abandonează
Cel mai bun răspuns

Hi Bart:

There are 2 issues that need to be fixed in the domain - remove the extra [] on the outside and add a condition for product template (I'm assuming you have a variable called product_template_id in your code). Try changing the domain expression in your code to the following:

[["value_ids.id", "=", value_id], ["attribute_id", "=", attribute_id], ["product_tmpl_id", "=", product_template_id]]


Imagine profil
Abandonează
Related Posts Răspunsuri Vizualizări Activitate
3
iul. 25
1630
1
iul. 24
2498
2
oct. 23
2042
5
mai 24
16672
2
mar. 24
1790