仅选择 Many2one 字段上的可用数据

selecting only the available data on Many2one field

我创建了一个模块 asset.management.handoverasset.management.handover.lines 以将所有 selected 资产保存到其中。

我完成了对 Many2one 字段数据的过滤,如下所示。 这是我的 .py 代码:

asset_name_id = fields.Many2one('account.asset.asset', string = "Asset", 
required = True)
serial_number_id = fields.Many2one('account.asset.asset.line', string = 
"Serial number", required = True)

我的.xml代码:

<field name="asset_name_id"/>
<field name="serial_number_id" domain = "[('serial_no_id', '=', 
asset_name_id)]"/>

如果我selectasset1,所有可用的序列号。 asset1 可以 selected。问题是:

我想,例如,如果我 select asset1 那么 select 序列号。 123 然后我想 select 另一个项目是 asset1 然后当我想 select 序列号。再次,问题来了,序列号。 123 再次可用。我想要实现的只是序列号。 123 将不再对 Many2one 可用,并且对该字段不可见。

please click this link to view the picture

(已编辑) 这是我的 .py

的完整代码
from odoo import api, fields, models
from datetime import datetime

class AssetManagementHandover (models.Model):
    _name = 'asset.management.handover'

    name = fields.Char(string = "Sequence")
    issuer_company_id = fields.Many2one ('res.partner', string = "Issuer's 
    Company")

    issuer_id = fields.Many2one ('hr.employee', string = "Issuer's Name")
    issuer_email = fields.Char (string = "Email", readonly = True, related = 
    'issuer_id.user_id.login', store = True)
    source_loc = fields.Many2one ('stock.warehouse', string = "Source 
    Location")

    recipient_company_id = fields.Many2one ('res.partner', string = 
    "Recipient's Company")
    recipient_id = fields.Many2one ('hr.employee', string = "Recipient's 
    Name")
    destination_loc = fields.Many2one ('stock.warehouse', string = 
    "Destination Location")

    remarks = fields.Text (string = "Remarks")

    date = fields.Date (string = "Date", default = lambda *a: 
    datetime.today())
    transfer_type = fields.Char (string = "Transfer type", default = "Asset 
    Handover", readonly = True)
    custodian_id = fields.Many2one ('res.users', string = "Custodian",     
    readonly = True, default=lambda self: self.env.uid)
    processed_by = fields.Many2one ('hr.employee', string = "Processed by", 
    readonly = True)
    lines_ids = fields.One2many('asset.management.handover.lines', 
    'lines_id', string = " ")

    state = fields.Selection ([
    ('draft', "Draft"),
    ('transfer', "Transferred"),
    ('cancel', "Cancelled"),
    ], string = "State", default = 'draft')

    @api.onchange('issuer_company_id')
    def onchange_company(self):
        self.issuer_id = ''
        self.emp_email = ''
        self.source_loc = ''

    @api.multi
    def button_transfer(self):
        self.state = 'transfer'
        self.processed_by = self.env['hr.employee'].browse(self.env.uid)

    @api.multi
    def button_cancel(self):
        self.state = 'cancel'
        self.processed_by = ''

class AssetManagementHandoverLine (models.Model):
_name = 'asset.management.handover.lines'

lines_id = fields.Many2one('asset.management.handover')
asset_name_id = fields.Many2one('account.asset.asset', string = "Asset", required = True)
serial_number_id = fields.Many2one('account.asset.asset.line', string = "Serial number", required = True)
model = fields.Char (string = "Model", related = 'asset_name_id.model_id', store = True, readonly = True)
condition_id = fields.Many2one ('asset.condition', string = "Asset Condition", required = True)
state = fields.Char (string = "State")
asset_pic = fields.Char(string = "Asset picture")
total = fields.Integer(string = "Total", default = "1")

@api.onchange('asset_name_id')
def on_change(self):
    self.serial_number_id = ''

这是我在 xml

中对 asset.management.handover 的表单视图
<!--Hand over form view-->
    <record model="ir.ui.view" id="handover_form_view">
        <field name="name">handover.form.view</field>
        <field name="model">asset.management.handover</field>
        <field name="arch" type="xml">
            <form>
                <header>
                    <button name="button_transfer" string="Transfer"     
type="object" state="cancel"/>
                    <button name="button_cancel" string="Cancel" 
type="object"/>
                    <field name="state" widget="statusbar"/>
                </header>
                <sheet>
                    <group>
                        <group>
                            <field name="date"/>
                            <field name="issuer_company_id" 
placeholder="Company name" domain="[('is_company','=',True)]"/>
                            <field name="issuer_id" placeholder="Employee's 
Name" domain = "[('address_id', '=', issuer_company_id)]"/>
                            <field name="source_loc" domain = "
[('partner_id', '=', issuer_company_id)]"/>
                            <field name="issuer_email"/>
                            <field name="remarks"/>
                        </group>
                        <group>
                            <field name="transfer_type"/>
                            <field name="recipient_company_id" 
placeholder="Company name" domain="[('is_company','=',True)]"/>
                            <field name="recipient_id" 
placeholder="Employee's Name" domain = "[('address_id', '=', 
recipient_company_id)]"/>
                            <field name="destination_loc" domain = "
[('partner_id', '=', recipient_company_id)]"/>
                            <field name="custodian_id"/>
                            <field name="processed_by"/>
                        </group>

                        <field name="lines_ids">
                            <tree editable="bottom">
                                <field name="asset_name_id"/>
                                <field name="serial_number_id" domain = "
[('serial_no_id', '=', asset_name_id)]"/>
                                <field name="model"/>
                                <field name="condition_id"/>
                                <field name="state"/>
                                <field name="asset_pic"/>
                                <field name="total" sum="total" string = 
"Total Asset"/>
                            </tree>

                            <form>
                                <sheet>
                                    <group>
                                        <group>
                                           <field name="asset_name_id"/>
                                            <field name="serial_number_id" 
domain = "[('serial_no_id', '=', asset_name_id)]"/>
                                            <field name="model"/>
                                            <field name="condition_id"/>
                                        </group>
                                        <group>
                                            <field name="state"/>
                                            <field name="asset_pic"/>
                                        </group>
                                    </group>
                                </sheet>
                            </form>
                        </field>
                    </group>
                </sheet>
            </form>
        </field>
    </record>

一个简单的方法是检查 writecreate 方法的值。如果序列号存在于超过 1 个产品上,则会引发异常。

另一种方法是设置动态域。例如,您可以说以下内容:

field1 发生变化时,我希望能够 select 仅来自 field2

上的这些记录

所以,定义一个onchange和return

return {'domain': {'field_id': [('id', 'not in', used_serials)]}}

used_serials 上,您将获得已使用的连续剧的 ID。