2017-12-18 22 views
0

ための複数の一致は私がOrder_lineフォームにcsvファイルからデータをインポートしようとしていますし、私はこの警告は、フィールド「注文ライン」

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のすべてが同じユーザに対して作成されていますが見つかりましたあなたがaccount_numberである私のcsvの最初の列を見たら。私たちには2つの異なるコラムがあります。

CSVヘッダー内の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です。

ORDER_LINEはメソッド

@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') 

のThを作成します。上記のモデルは、私が輸入を行っている別のモデルです。このモデルから、顧客に対するすべての注文を作成する必要があります。あなたはこれをやっている場合

+0

オーダー明細から直接顧客データをインポートしようとしていますか?他の質問で新しいダミーフィールドや新しいトランジェントモデルを作成する際に教えた方法を使用していますか? – ChesuCR

+0

createメソッドをオーバーライドして注文行を作成し、顧客がデータベースに複製されていないことを確認します – ChesuCR

+0

質問にcreateメソッドを追加して、それが正しいかどうかを確認してください – ChesuCR

答えて

0

があることに留意してください:

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

をデータベースにproduct_codeユニークを作る制約を作成する必要があります。そうでない場合は、重複に問題があります

モデルを作成し、インポートしたいフィールドを追加することをお勧めします。これは、慣れ親しんだモデルであるため、TransientModelである必要があります。それに何かを保存することには興味がありません。

一方、元のorder_lineモデルのcreateメソッドをオーバーライドしないでください。

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 
関連する問題