如何从 Odoo 中的产品模板属性行创建产品变体?

How to create product variants from the product template attribute lines in Odoo?

我正在使用 Odoo 10,并且我创建了一组产品模板。由于我启用了产品变体,因此每个产品模板都生成了一个产品变体。然后,我导入了一个 CSV 文件,该文件将产品属性行添加到产品模板。它运作良好,因为产品模板现在具有各自的属性行。

由于我导入了这些属性行而不是手动创建它们,因此它们没有生成产品变体。比如我导入属性行Size with S, M, 模板 T 恤 的 L 值。我预计 Odoo 会删除单个 T-Shirt 变体并生成变体 T-shirt ST-shirt MT 恤 L(这是向模板添加属性或属性值时的行为),但它什么也没做。

所以我试图通过代码生成它们,为此我使用 shell。首先,我搜索我创建的模板。一旦我将它们存储在名为 templates 的变量中,我就对模板记录集执行 create_variant_ids

>>> templates = self.env['product.template'].search([('create_date', '>=', '2019-01-06 00:00:00')])
>>> templates.create_variant_ids()

结果是这个:

2019-01-09 10:33:00,993 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1052]
2019-01-09 10:33:01,782 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1061]
2019-01-09 10:33:02,573 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1054]
2019-01-09 10:33:03,353 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1055]
2019-01-09 10:33:04,166 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1056]
2019-01-09 10:33:05,000 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1057]
2019-01-09 10:33:05,828 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1058]
2019-01-09 10:33:06,621 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1053]
2019-01-09 10:33:07,438 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1059]
2019-01-09 10:33:08,241 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1060]
2019-01-09 10:33:09,051 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [1051]
2019-01-09 10:33:09,841 2775 INFO trivi_v10 odoo.models.unlink: User #1 deleted product.product records with IDs: [956]
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/opt/odoo/odoo_10/src/linked/product/models/product_template.py", line 403, in create_variant_ids
    'attribute_value_ids': [(6, 0, variant_ids.ids)]
  File "/opt/odoo/odoo_10/src/linked/product/models/product.py", line 322, in create
    product = super(ProductProduct, self.with_context(create_product_product=True)).create(vals)
  File "/opt/odoo/odoo_10/src/linked/mail/models/mail_thread.py", line 228, in create
    thread = super(MailThread, self).create(values)
  File "/opt/odoo/odoo_10/src/oca/OCB/odoo/models.py", line 3847, in create
    record = self.browse(self._create(old_vals))
  File "/opt/odoo/odoo_10/src/oca/OCB/odoo/models.py", line 4002, in _create
    self._validate_fields(vals)
  File "/opt/odoo/odoo_10/src/oca/OCB/odoo/models.py", line 1078, in _validate_fields
    check(self)
  File "/opt/odoo/odoo_10/src/linked/product/models/product.py", line 310, in _check_attribute_value_ids
    raise ValidationError(_('Error! It is not allowed to choose more than one value for a given attribute.'))
ValidationError: (u'Error! It is not allowed to choose more than one value for a given attribute.', None)

我认为 ID 为 956 的产品变体会有问题,但它与其他变体的数据相似。

有谁知道如何创建产品变体(通过代码或界面)?

已解决。

问题是导入文件有误,因为它有不止一次关联到同一个产品模板的同一个产品属性行。

例如,产品模板T恤有两行尺码

一旦我纠正了导入文件的重复项,我就可以使用 shell 毫无问题地执行 create_variant_ids

顺便说一下,如果您不想通过 shell 执行此操作,则在导入产品属性行后通过界面重新计算变体的解决方法是存档您的产品模板,然后取消存档他们。

如果您筛选为仅查看要更新、显示的产品模板并 select 所有这些模板都在树视图中,则速度非常快,单击 操作 > 存档,然后将搜索过滤器 Unarchived 添加到您的搜索过滤器,再次 select 它们并单击 Action > Unarchived。此过程重新计算所有变体,从而根据导入的产品属性行创建我的新变体。