میشه توضیحی در این مورد داشته باشین
1 پاسخ
اودوو و فیلد reference :
Odoo دارای انواع مختلفی از فیلدها مانند Character، Integer، Boolean و غیره است. Odoo همچنین دارای فیلدهای رابطه ای است که به ایجاد روابط بین مدل های مختلف کمک می کند. یک فیلد مرجع به ایجاد یک رابطه پویا در یک مدل کمک می کند، به این معنی که می توانیم مدل را به صورت پویا برای ایجاد رابطه انتخاب کنیم. در فیلدهای Many2one، One2many و Many2many میتوانیم مدل هدفی را که باید در آن رابطه ایجاد شود، از قبل تعریف کنیم. به عنوان مثال، در یک سفارش فروش، اگر یک فیلد Many2one برای مشتریان ایجاد کنیم، فقط بین این دو مدل رابطه ایجاد می کند، در اینجا مدل هدف یعنی مشتریان را از قبل تعریف می کنیم.
در مورد فیلد مرجع ابتدا می توانیم مدل هدف را انتخاب کرده و سپس رکورد را انتخاب کنیم. به عنوان مثال، در مدل مشتری، باید فیلد "منبع سند" را اضافه کنم. در این مورد، برای برخی از مشتریان، ممکن است مجبور شوم یک سفارش خرید را به عنوان منبع سند اضافه کنم، برای برخی دیگر از مشتریان باید سفارش فروش را به عنوان منبع اضافه کنند. گاهی اوقات ممکن است لازم باشد یک فاکتور به عنوان منبع اضافه کنم. در این صورت می توانم یک فیلد مرجع برای این کار تعریف کنم. ابتدا باید مدل (خرید، فروش یا فاکتور) را انتخاب کنم و سپس رکورد را انتخاب کنم.
نمونه مثال رو میتونید در قسمت زیر مشاهده کنید
Settings >> Technical >> Menu Items.
اگر بخواهیم یک آیتم منو از اینجا ایجاد کنیم، باید یک Action را برای این منو انتخاب کنیم. این فیلد Action یک فیلد مرجع است. چون ابتدا باید اکشن مدل را انتخاب کنیم، یعنی انتخاب کنیم که آیا ir.actions.the report، ir.actions.server، ir.actions.act_window و غیره باشد. مدل انتخاب شده
پس از انتخاب مدل، فیلد دیگری برای انتخاب رکوردها در مدل انتخاب شده نشان داده می شود.
پس از ذخیره، به عنوان یک فیلد واحد (فقط رکورد) مانند یک فیلد Many2one نشان داده می شود.
ما می توانیم بررسی کنیم که چگونه می توانیم فیلدهای مرجع را تعریف کنیم. برای این، من فیلد منبع سند بالا در مخاطبین را به عنوان مثال میآورم.
source_document = fields.Reference (
selection = [
('sale.order', 'Sale Order'),
('purchase.order', 'Purchase Order'),
('account.move', 'Invoice')
], string = "Source Document"
)
در اینجا، میتوانیم سفارش فروش، سفارش خرید یا فاکتور را برای مشتریانی از همان زمینه انتخاب کنیم.
مشتری با شماره فروش
مشتری با کد خرید
مشتری با فاکتور ref.
همچنین، می توانیم مقادیر ?? را برای انتخاب از یک تابع انتخاب کنیم. به یاد داشته باشید که من باید رکوردها را از همه ماژول های یک فیلد انتخاب کنم. سپس استفاده کنید
source_document = fields.Reference (
selection = '_ select_target_model',
string = "Source Document"
)
@ api.model
def _select_target_model (self):
models = self.env ['ir.model']. search ([])
return [(model.model, model.name) for model in models]
تمام مدل های موجود را برای انتخاب نشان می دهد.
یک فیلد مرجع در پایگاه داده با عنوان ، id ذخیره می شود.
به عنوان مثال : sale.order, 10
ما میتوانیم مانند فایل Many2one به فیلدهای مرجع دسترسی داشته باشیم.
def _selection_target_model (self):
model = self.env ['ir.model']. search ([('model', '=', 'sale.order')])
return [(model.model, model.name) ]
source_document = fields.Reference (
selection = '_ selection_target_model',
string = "Source Document",
compute = "_ compute_sale_order",
inverse = "_ set_sale_order"
)
def _compute_sale_order (self):
order = self.env ['sale.order'].search([('partner_id', '=', self.id)], order = 'id desc',limit = 1)
for rec in self:
if order:
rec.source_document = '% s,% s'% ('sale.order', order.id)
Else:
rec.source_document = False
def _set_sale_order (self):
order = self.env ['sale.order']. search ([('partner_id', '=', self.id)], order = 'id desc', limit = 1)
for rec in self:
if rec.source_document:
order.id = rec.source_document.id
In the above code, it will select the last sale order of the partner if he has an order, defining an 'inverse' function to make the compute field editable, so we can also select the orders. We can write data in to a reference field like,self.field_name = '% s,% s'% (' model.
Eg: self.order_ref = '% s,% s'% (purchase.order', order.id)