2016-11-15 10 views
1

これは私の構造体である:Odoo 10のオブジェクトからIDを取得するには?

class Imprint_Location(models.Model): 
    _name = 'imprint.location' 

    name = fields.Char() 
    product_id = fields.Many2one('product.template') 

class Imprint_Charges(models.Model): 
    _name = 'imprint.charge' 
    _rec_name = 'location_id' 

    product_id_c = fields.Many2one('product.template', required=True) 
    location_id = fields.Many2one('imprint.location', required=True) 
    @api.multi 
    @api.onchange('product_id_c', 'location_id') 
    def product_filter(self): 
     res = {} 
     print '\n\n-------\n\n', self, self.product_id_c, '\n\n-------\n\n' 
     if self.product_id_c: 
      res['domain'] = {'location_id': [('product_id', '=', self.product_id_c.id)]} 
      print res 
     return res 

class Product_Template(models.Model): 
    _inherit = 'product.template' 

    imprint_location_ids = fields.One2many('imprint.location', 'product_id') 
    sale_imprint_charge_ids = fields.One2many('imprint.charge', 'product_id_c') 

は、今私はproduct.templateでページを定義し、ページ内<tree editable="bottom">であるsale_imprint_charge_idsあると私はproduct_id_cフィールドを選択していないですした[また、このフィールドにはには表示されません。定義されたツリー]。

今ここに私の問題は、私がimprint.chargeのために正常に動作しますが、私はその後、product.templateから入力したときに、私は

TypeError: <odoo.models.NewId object at 0x7fbb8bc21b90> is not JSON serializable

を言ってエラーが出る product_filter方法を定義し、フォームビューからこれを選択すると、

<odoo.models.NewId object at 0x7fbb8bc21b90>を渡す場合はproduct.templateからですので、self.product_id_cを印刷するとproduct.template(<odoo.models.NewId object at 0x7fbb8bc21b90>)が出力されるので、これはシリアル化できません。私はself.product_id_c.idsを実行して、空のリスト[]を出力しようとしました。

したがって、オブジェクトからproduct.template IDを取得するか、またはid自体をいくつかのメソッドをオーバーライドして渡す必要があります。

答えて

1

以下の点をいくつか改善してください。

  • RES [ 'ドメイン'] = { 'LOCATION_ID':[( 'PRODUCT_ID'、 '='、self.product_id_c.id)]}
  • リターンRES
  • 研究一部検索ORMの()メソッド

次のコードで試してみてください。

@api.multi 
@api.onchange('product_id_c', 'location_id') 
def product_filter(self): 
    res = {} 
    if self.product_id_c: 

     self.location_id = False 

     #search product_template in imprint.locationwith table and limit we will get only record if related record found 
     location_id = self.env['imprint.location'].search([('product_id', '=', self.product_id_c.id)], limit=1) 

     if location_id: 

      #location_id.ids will give you something like [2] so we need to set value as 2 
      self.location_id = location_id.ids[0] 

編集:

最初のコメントによれば、関連する場所の一覧が必要です。

  • インプリントにドメインを追加product_filter()メソッド
  • を削除します。その後

    <field name="location_id" domain="[('product_id', '=', product_id_c)]"/> 
    

    、再起動Odooサーバとカスタムモジュールをアップグレードします。たとえばオブジェクトビューファイル

を充電します。

+0

私はフィールド 'location_id'をフィルタリングする必要があります...私はその製品のフィールドを表示したいだけです...結果はリストになる可能性があり、ユーザは選択する 'location_id'を選択します – maharshi

+0

それでも 'product.template'から空のレコードセットを取得すると、' id'ではなく 'object'を渡します。 – maharshi

1

新しいレコードを作成すると、Odooはwierd <odoo.models.NewId object at 0x7fbb8bc21b90>オブジェクトを作成します。あなたがレコードを書いた後、このidはあなたが使用していた通常のID(整数)に変換されます。この状況では、そのような値が実​​際に存在しない時点で実際のid値を(不当に)期待している関数があります。 idが整数であるかどうかを評価し、その状況で代替値を提供するなど、代替手段を提供する必要があります。あなたの関数は、私があなたが何が起こることを期待しているかをかなり知っていないオブジェクトを返すようだが。フィールドの値を変更したい場合は、オブジェクトを返すのではなく、自己オブジェクトの値を変更します。

関連する問題