CRM | e-Commerce | Accounting | Inventory | PoS | Project management | MRP | etc.
Guys, I'm a beginner so sometimes I have a problem with some things. I would like to get a value from sale_order_line.
In my table I have a column named: item_location
How to get data from this column?
class sale_order_line(models.Model): _inherit = 'sale.order.line' item_location = fields.Char(compute='get_location', string = 'Item location', type='Char') def get_location(self): location = self.env['sale.order.line'].search([('product_id','=',self.product_id.id)]) print ' Self product ID :', self.product_id.id# Ok print ' Self ID :', self.id # ok print ' Location ID :', location.id # ok print ' Location name :', location.item_location # False res = location.item_location # this is what I need return res sale_order_line()
but I still missing something because I can't get a value from the item_location column.
How to do it with a new API ?
You guys are right, I don't have to do it using Search or Browse in this case ;) because that field is available directly :)
Ii's another valuable lesson for me, THANK YOU GUYS
Hi @Dr Obx
You need put the model of that query and the domain like:
location = self.env['sale.order.line'].search([('product_id','=',self.product_id.id)])
bolded are the changes to your code, the model is sale.order.line like every other api model method interaction and the domain need to be changed to pass exactly the id value of the product_id relation field because the domain parser will not do it for you, you need to pass exactly the value in the param #3 of the domain tuple.
Also if your item_location field is on the sale.order.line model you need to access it like:
if it's on the product.product model then you could get it (using your actual code) like:
but you could directly access the product if you don't need the sale.order.line changing your search like:
product = self.env['product.product'].search([('id','=',self.product_id.id)])
item_location = product.item_location
this last is guessing where is located the field item_location because was not clear to me in your answer
Hope this helps
Seeing your code changes seems that you are doing more than needed for get the item_location.
1- The item_location is on your sale.order.line so you could access it directly from the outside of the model, you don't need a computed field for that.
2- The search is not necessary because search usually is for get the ids and you already have the id, so a search with that domain will produce the same self.id value but with the browse applied so you could directly use the browse like:
location = self.env['sale.order.line'].browse(self.id)
But I repeat you could directly get the value from the outside without using a computed field. Also for the same thing there is a field definition way that will cause that Odoo get the value of others fields in the table or walking through many2one relations fields, like:
item_location = fields.Char(related='item_location', string = 'Item location')
And nothing more is needed
The thing appears to be that the sale order line doesn't have a value for the item_location field
If you are calling your method on compute attribute, it will work like functional field.
This method will automatically load for sale order line model self, because you already using that method in same model so you don't need to call search method in sale.order line.
Here you go,
Do one thing,
set api.multi decorator on your method.
So, your method will look lik,
for line in self:
#self will work for all sale order line you can directly check in line record, line itself will appear as browse record
Second note, if your sale order line does not having any location value in that case of course it will give you false value, you have to put if condition for that, if you location than move further for next execution.
Hope this might help you.
About This Community
Odoo Training Center
|Asked: 3/4/16, 7:54 AM|
|Seen: 6700 times|
|Last updated: 10/10/17, 6:46 AM|