Найдено несколько совпадений для поля «Строка заказа»

Я пытаюсь импортировать данные из csv в форму Order_line и вижу это предупреждение

Found multiple matches for field 'Order Line' (2 matches) between rows 2 and 6 (4 more)
  Found multiple matches for field 'Order Line' (2 matches) between rows 2 and 6
  Found multiple matches for field 'Order Line' (2 matches) between rows 2 and 6
  Found multiple matches for field 'Order Line' (2 matches) between rows 2 and 6
  Found multiple matches for field 'Order Line' (2 matches) between rows 2 and 6

и из-за этого все строки order_lines создаются для одного и того же пользователя, но если вы видите первый столбец моего csv, который является account_number. У нас есть две разные колонки.

CSV

customer/account_number,customer/first_name,customer/last_name,customer/account_type,order/transaction_id,order/product_code,order/quantity
1160925,Charles L.,Richards,Segregated,10981036,G108P70NG,50
1160925,Charles L.,Richards,Segregated,10981037,G108P70NG,150
1160925,Charles L.,Richards,Segregated,10981038,G108P70NG,250
1160925,Charles L.,Richards,Segregated,10981039,G11270NG,350
1160243,"Tracy A., Jr.",Tolar,Segregated,23231554,G108P70NG,750

Примечание

Порядок в заголовке csv на самом деле order_line за кадром, мы просто переименовали его в шаблоне csv для клиента.

Способ создания строки заказа

@api.model
def create(self, vals):
    product_id = False
    product_code = vals.get('product_code')
    if product_code:
        product = self.env['amgl.products'].search([
            ('product_code', '=', product_code)
        ])
        if product:
            product_id = product[0].id
        vals.update({
            'products': product_id,
        })
    record = super(OrderLine, self).create(vals)
    if (float(record['total_received_quantity']) > float(record['quantity'])):
        record.state = 'pending'
    return record

Модель линии заказа

class OrderLine(models.Model):
_name = 'amgl.order_line'
_description = 'Order Lines'

name = fields.Char()
customer_id = fields.Many2one('amgl.customer', string='Customer Name',
                              default=lambda self: self._context.get('customer_id', False),required=True)

Импорт модели

class CustodianDataImport(models.Model):
_name = 'amgl.custodian_data_import'
_description = 'Custodian Data Import'

customer = fields.One2many('amgl.customer', 'custodian_import_id', string='Customer')
order = fields.One2many('amgl.order_line', 'custodian_import_id', string='Order Line')

Эта модель выше — это отдельная модель, в которой я выполняю импорт, и из этой модели должен быть создан весь заказ для клиента.


person Ancient    schedule 18.12.2017    source источник
comment
Вы пытаетесь напрямую импортировать данные клиента из строки заказа? Используете ли вы метод, который мы рассказали вам в другом вопросе, создавая новые фиктивные поля или новую модель Transient?   -  person ChesuCR    schedule 22.12.2017
comment
Если вы переопределяете метод create для создания строк заказа, убедитесь, что клиент не дублируется в базе данных.   -  person ChesuCR    schedule 22.12.2017
comment
Пожалуйста, добавьте метод создания к вопросу, чтобы проверить, правильно ли он   -  person ChesuCR    schedule 22.12.2017
comment
Пожалуйста, смотрите мое обновление вопроса, я добавил весь соответствующий код.   -  person Ancient    schedule 22.12.2017


Ответы (1)


Имейте в виду, что если вы делаете это:

product = self.env['amgl.products'].search([
    ('product_code', '=', product_code)
])
if product:
    product_id = product[0].id

Вам нужно создать ограничение, делающее product_code уникальным в базе данных. В противном случае у вас были бы проблемы с дубликатами.

Я предлагаю вам создать модель и добавить поле, которое вы хотите импортировать, как вы уже сделали, но это должно быть TransientModel, потому что это только вспомогательная модель, и вам не нужно ничего в ней хранить.

С другой стороны, я думаю, что вы не должны переопределять метод create исходной модели order_line. Просто добавьте все, что вам нужно, в метод создания вспомогательной модели, например:

class OrderLineImport(models.TransientModel):
    _name = 'order.line.import'

    customer_name = fields.Char(
        string='Customer',
    )

    product_code = fields.Char(
        string='Product Code',
    )

    @api.model
    def create(self, vals):
        product_code = vals.get('product_code', False)
        customer_name = vals.get('customer_name', False)

        product_id = self._get_product_id(product_code)
        customer_id = self._get_customer_id(customer_name)

        order_line = {
            'product_id': product_id,
            'customer_id': customer_id
        }
        self.env['amgl.order_line'].create(order_line)   # the important create

        # You can create records of the model order.line.import as well, but they are going to disappear
        # because it is a transient model. I think that this is good to keep your database clean

        return super(OrderLineImport, self).create(vals)

    def _get_product_id(self, product_code):
        if product_code:
            product = self.env['amgl.products'].search([
                ('product_code', '=', product_code)
            ])
            if len(product) == 1:
                return product.id
            elif len(product) == 0:
                raise Warning(_('Product code not found: %s') % product_code)
            else:
                raise Warning(_('More than one product_code found: %s') % product_code)
        else:
            return False

    def _get_customer_id(self, customer_name):
        if customer_name:
            customer = self.env['amgl.customer'].search([
                ('name', '=', customer_name)
            ])
            if len(customer) == 1:
                return customer.id
            elif len(product) == 0:
                raise Warning(_('Customer not found: %s') % customer_name)
            else:
                raise Warning(_('More than one customer found: %s') % customer_name)
        else:
            return False
person ChesuCR    schedule 28.12.2017