Odoo 9 表单视图自定义保存方法

Odoo 9 form view custom saving method

我们正在尝试在 Odoo 9 安装中实施自定义预订类型的解决方案。该解决方案包括一个 Reservation 模型和一个 Session 模型。 Reservation 的功能之一是作为 Sessions 的关联容器。 Session 模型有一个 Many2one 字段链接到 Reservation 模型。

至此,我们已经定义了模型和一个允许我们创建新预订的标准表单视图。但是,我们希望视图包含一个下拉小部件,允许我们 select 伴随会话的数量,并且我们希望保留保存功能来创建适当数量的会话。

我们在实现这个过程中遇到了两个问题:

我们不需要任何人为我们编写代码,但由于我们是该平台的新手,因此为我们指明适当方法的总体方向会很棒。

编辑:

这是我们目前的相关代码:

models.py

class ResNumber(models.Model):
    _name = 'restest.res_num'
    name = fields.Char(string="Number to book", required=True)
    num = fields.Integer(string="Number", required=True)

class Reservation(models.Model):
    _name = 'restest.reservations'
    name = fields.Char(string="Title", required=True)
    num_booked = fields.Many2one('restest.res_num', ondelete='set null', string="Number to book")
    slot_id = fields.Many2one('restest.slots', ondelete='set null', string="Slot ID")
    session_ids = fields.One2many('restest.sessions', 'reservation_id', string="Session IDs")
    customer = fields.Many2one('res.partner', ondelete='set null', string="Customer")

    @api.model
    def create(self, vals):
        res_id = super(Reservation, self).create(vals)
        numValue = res_id.num_booked.num
        resIdValue = res_id.id
        start = 1
        while start <= numValue:
            self.env['restest.sessions'].create({'name': start, 'reservation_id': resIdValue})
            start = start + 1
        return res_id

class Session(models.Model):
    _name = 'restest.sessions'
    name = fields.Char(string="Title", required=True)
    reservation_id = fields.Many2one('restest.reservations', ondelete='set null', string ="Reservation ID")

views.xml

<record model="ir.ui.view" id="reservation_create_view">
            <field name="name">reservation.form</field>
            <field name="model">restest.reservations</field>
            <field name="arch" type="xml">
                <form string="Make a Reservation">
                    <sheet>
                        <group>
                            <field name="name"/>
                            <field name="slot_id"/>
                            <field name="num_booked"/>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.actions.act_window" id="make_res_action">
            <field name="name">Make a Reservation</field>
            <field name="res_model">restest.reservations</field>
            <field name="view_type">form</field>
            <field name="view_mode">form</field>
            <field name="view_id" ref="reservation_create_view"/>
        </record>

defaultData.xml

<?xml version="1.0" encoding="utf-8"?>
    <openerp>
    <record id="first_cat" model="restest.res_num">
        <field name="name">1</field>
        <field name="num">1</field>
    </record>
    <record id="second_cat" model="restest.res_num">
        <field name="name">2</field>
        <field name="num">2</field>
    </record>
    <record id="third_cat" model="restest.res_num">
        <field name="name">3</field>
        <field name="num">3</field>
    </record>
    <record id="fourth_cat" model="restest.res_num">
        <field name="name">4</field>
        <field name="num">4</field>
    </record>
</openerp>

所以这里的测试实现很简单。我们创建了 ResNumber 模型并用 1-4 中的条目预填充了它。 Reservation 模型中的 Many2one 字段是用户可以 select 保留多少会话的当前方式。我们覆盖了默认创建命令,以根据 ResNumber 字段的值创建会话数。

然而,我们想要的是完全删除 ResNumber 模型。将此数字存储在 table 中不是一个好的数据库实践,因为它可以通过备用查询派生。我们想要做的是在 Reservation 模型的表单视图中包含一个字段,其编号为 selection,然后在创建 Session 实例后立即丢弃该值.有什么办法吗?

使用选择字段并将商店 属性 设置为 False

fields.Selection([(1, '1'), 
                  (2, '2'), 
                  (3, '3'), 
                  (4, '4')], string='ResNumber' store=False)

这很简单,如果 '1' 在前端显示给用户,但在后端返​​回的值是整数 1 并且当您设置store to False 您告诉 odoo 不要将值存储在数据库中(它可能应该只用于向用户显示信息或形成某种计算或逻辑)