콘텐츠로 건너뛰기
메뉴
커뮤니티에 참여하려면 회원 가입을 하시기 바랍니다.
신고된 질문입니다
3 답글
5486 화면

Hello, I want to compute a field based on a number of records in a table.

That I want to do at the finish is :

code_tarif
numero_ordre
...
12
1
...
12
2
...
15
1
...
15
2
...
15
3
...

But with this code, I have an error if I have more than 1 record in the table :

Code :

 class miadi_lignesTarifs(models.Model):
    _name = 'miadi.lignestarifs'
  
    code_tarif = fields.Many2one('miadi.tarifs', 'Price Code', default='', required=True, ondelete='cascade')
    numero_ordre = fields.Integer('Order number', compute='_compute_numero_ordre')
    produit_id = fields.Many2one('product.product', 'Product', required=True, ondelete='cascade')
    conditionnement_id = fields.Many2one('miadi.packaging', 'Packaging', required=True, ondelete='cascade')

    @api.depends('code_tarif')
    def _compute_numero_ordre(self):
        tarifs = self.env['miadi.lignestarifs']
        self.numero_ordre = tarifs.search_count([('code_tarif', '=', self.code_tarif.id)])

Error :

ValueError: Expected singleton: miadi.lignestarifs(17, 18)


I tried to do it overriding the create method :

@api.multi
@api.model
def create(self, vals):
    tarifs = self.env['miadi.lignestarifs']
    self.numero_ordre = tarifs.search_count([('code_tarif', '=', self.code_tarif.id)])
    return super(miadi_lignesTarifs, self).create(vals)

But it gives me this :

TypeError: create() takes exactly 2 arguments (1 given)


How can I do what I want ?

I'm on Odoo 10

Thanks for answers

아바타
취소
작성자

Hi NIKHIL, I answer you in comment because I've not enought karma.

This solution doesn't work because it will put the same order number for all records.

I found the solution, I overrided the create method. In my first post, the create method were good but I had an error because of the copy/paste. I delete the function and I rewrit it and it works.

Thanks

베스트 답변

Hi 
Please use this code, it may help you. thanks

  @api.depends('code_tarif')
    def _compute_numero_ordre(self):
        tarifs = self.env['miadi.lignestarifs']
        for rec in self:
            rec.numero_ordre = tarifs.search_count([('code_tarif', '=', rec.code_tarif.id)])

the compute function may run in the time of tree view loaded.  that time 'self' contain multiple records, to solve this we can use for loom.
and  why you super the create function, there is no need of it.


아바타
취소
작성자 베스트 답변

I found the solution !

I use the create method and I override it.

I don't know why it didn't work but I delete the create method and I rewrite it again and it works.

아바타
취소

Without this create method it wont work ?

작성자

Hi Niyas, no without this, I doesn't work