跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. OpenERP对象定义详解(连载中...)

OpenERP对象定义详解(连载中...)

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
30 帖子 17 发布者 70.1k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • M 离线
    M 离线
    mrshelly
    写于 最后由 编辑
    #11

    本着看野史与八卦的心态, 45度观望....

    1 条回复 最后回复
    0
    • D 离线
      D 离线
      digitalsatori 管理员
      写于 最后由 编辑
      #12

      "为人性僻耽佳句,语不惊人死不休"。老肖的文字不是用来惊人的,但是技术文档能写得如此透彻,绝对是花了功夫去专研理解的,向老肖致敬。
        对文档做一些小补充:
       
        [list]
      [li][b]_auto[/b]  当_auto的值为“False"时,OE不会自动在数据库中创建相应的表,开发者可以在对应类的init()方法中定义表或视图的SQL。这一般应用在  报表所对应的数据对象中,因为报表的数据对象往往是“视图”,所以我们可以在init()方法中创建所需的数据库视图SQL即可。[/li]
      [li][b]_columns[/b] OE并不一定为每个定义项创建数据库字段,比如:selection, reference, one2many, function等字段是不会有对应的数据库字段的。[/li]
      [li][b]_name[/b] 当使用_inherit时可以与被继承的类的_name一致,_name一致表示不创建新的数据库表,而直接在原表上修改[/li]
      [li][b]_rec_name[/b]  缺省的情况下,name_get方法使用表中的‘name'字段,所以当你定义了一个实体类B,并且实体类B中即没有“name“字段也没有为  _rec_name特别指定一个字段,  那么当OE调用name_get方法时(比如实体类A有一个many2one字段b指向实体类B,显示A.b的值时就会调用类B的name_get方法)  就会报“未定义name字段“的错误[/li]
      [li][b]_inherits[/b]  另外还可以这样理解_inherits,_inherits又被称为实例继承,就是新继承的数据对象不但继承被继承对象的属性和方法同时也继承了数据实  例,即表中的记录。比如product类不但继承product_template的属性和方法,而且这两个表的数据也是同步的。[/li]
      [li][b]_defaults[/b] 在V6中字典的值可以不是函数,就比如在V5中我们必须这样来定义:_defaults= { 'state' : lambda *a: 'draft'} 而在 V6中可以这样来:_defaults = {'state' : 'draft'}[/li]
      [/list] 

      【上海先安科技】(tony AT openerp.cn)

      1 条回复 最后回复
      0
      • N 离线
        N 离线
        NewZN
        写于 最后由 编辑
        #13

        校长的补充很好!

        1 条回复 最后回复
        0
        • T 离线
          T 离线
          tomp
          写于 最后由 编辑
          #14

          感谢各位达人!

          1 条回复 最后回复
          0
          • J 离线
            J 离线
            Joshua 管理员
            写于 最后由 编辑
            #15

            顶老肖!!

            【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

            1 条回复 最后回复
            0
            • W 离线
              W 离线
              wjfonhand
              写于 最后由 编辑
              #16

              深入浅出,值得阅读

              GoodERP -- Odoo China fork

              1 条回复 最后回复
              0
              • N 离线
                N 离线
                NewZN
                写于 最后由 编辑
                #17


                OpenERP对象支持的字段类型有,基础类型:char, text, boolean, integer, float, date, time, datetime, binary;复杂类型:selection, function, related;关系类型:one2one, one2many, many2one, many2many。下面逐一说明。
                [b]boolean[/b]: 布尔型(true, false)
                integer: 整数。
                [b]float[/b]: 浮点型,如 'rate' : fields.float('Relative Change rate',digits=(12,6)), digits定义整数部分和小数部分的位数。
                [b]char[/b]: 字符型,size属性定义字符串长度。
                [b]text[/b]: 文本型,没有长度限制。
                [b]date[/b]: 日期型
                [b]datetime[/b]: 日期时间型
                [b]binary[/b]: 二进制型
                [b]function[/b]: 函数型,该类型的字段,字段值由函数计算而得,不存储在数据表中。其定义格式为:
                fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type='float', fnct_search=None, obj=None, method=False, store=True)
                · type 是函数返回值的类型。
                · method 为True表示本字段的函数是对象的一个方法,为False表示是全局函数,不是对象的方法。如果method=True,obj指定method的对象。
                · fcnt 是函数或方法,用于计算字段值。如果method = true, 表示fcnt是对象的方法,其格式如下:def fnct(self, cr, uid, ids, field_name, args, context),否则,其格式如下:def fnct(cr, table, ids, field_name, args, context)。ids是系统传进来的当前存取的record id。field_name是本字段名,当一个函数用于多个函数字段类型时,本参数可区分字段。args是'arg=None'传进来的参数。
                · fcnt_inv 是用于写本字段的函数或方法。如果method = true, 其格式是:def fcnt_inv(self, cr, uid, ids, field_name, field_value, args, context),否则格式为:def fcnt_inv(cr, table, ids, field_name, field_value, args, context)
                · fcnt_search 定义该字段的搜索行为。如果method = true, 其格式为:def fcnt_search(self, cr, uid, obj, field_name, args),否则格式为:def fcnt_search(cr, uid, obj, field_name, args)
                · store 表示是否希望在数据库中存储本字段值,缺省值为False。不过store还有一个增强形式,格式为 store={'object_name':(function_name,['field_name1','field_name2'],priority)} ,其含义是,如果对象'object_name'的字段['field_name1','field_name2']发生任何改变,系统将调用函数function_name,函数的返回结果将作为参数(arg)传送给本字段的主函数,即fnct。

                [b]selection[/b]: 下拉框字段。定义一个下拉框,允许用户选择值。如:'state': fields.selection((('n','Unconfirmed'),('c','Confirmed')),'State', required=True),这表示state字段有两个选项('n','Unconfirmed')和('c','Confirmed')。

                [b]one2one[/b]: 一对一关系,格式为:fields.one2one(关联对象Name, 字段显示名, ... )。在V5.0以后的版本中不建议使用,而是用many2one替代。
                [b]many2one[/b]: 多对一关系,格式为:fields.many2one(关联对象Name, 字段显示名, ... )。可选参数有:ondelete,可选值为"cascade"和"null",缺省值为"null",表示one端的record被删除后,many端的record是否级联删除。

                [b]one2many[/b]: 一对多关系,格式为:fields.one2many(关联对象Name, 关联字段, 字段显示名, ... ),例:'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts')。

                [b]many2many[/b]: 多对多关系。例如:
                    'category_id':fields.many2many('res.partner.category','res_partner_category_rel','partner_id','category_id','Categories'),
                表示以多对多关系关联到对象res.partner.category,关联表为'res_partner_category_rel',关联字段为'partner_id'和'category_id'。当定义上述字段时,OpenERP会自动创建关联表为'res_partner_category_rel',它含有关联字段'partner_id'和'category_id'。

                [b]reference[/b]: 引用型,格式为:fields.reference(字段名, selection, size, ... )。其中selection是: 1)返回tuple列表的函数,或者 2)表征该字段引用哪个对象(or model)的tuples列表。reference字段在数据库表中的存储形式是(对象名,ID),如(product.product,3)表示引用对象product.product(数据表product_product)中id=3的数据。reference的例子:
                    def _links_get(self, cr, uid):
                        cr.execute('select object,name from res_request_link order by priority')
                        return cr.fetchall()

                    ...
                    'ref':fields.reference('Document Ref 2', selection=links_get, size=128),
                    ...
                上例表示,字段ref可以引用哪些对象类型的resource,可引用的对象类型从下拉框选择。下拉框的选项由函数_links_get返回,是(object,name)对的列表,如[("product.product","Product"), ("account.invoice","Invoice"), ("stock.production.lot","Production Lot")] 。

                [b]related[/b]: 关联字段,表示本字段引用关联表中的某字段。格式为:fields.related(关系字段,引用字段,type, relation, string, ...),关系字段是本对象的某字段(通常是one2many or many2many),引用字段是通过关系字段关联的数据表的字段,type是引用字段的类型,如果type是many2one or many2many, relation指明关联表。例子如下:
                        'address': fields.one2many('res.partner.address', 'partner_id', 'Contacts'),
                        'city':fields.related('address','city',type='char', string='City'),
                        'country':fields.related('address','country_id',type='many2one', relation='res.country', string='Country'),

                这里,city引用address的city字段,country引用address的country对象。在address的关联对象res.partner.address中,country_id是many2one类型的字段,所以type='many2one', relation='res.country'。

                [b]property[/b]: 属性字段,下面以具体例子解说property字段类型。
                'property_product_pricelist': fields.property('product.pricelist', type='many2one', relation='product.pricelist',string="Sale Pricelist", method=True, view_load=True, group_name="Pricelists Properties")
                这个例子表示,本对象通过字段'property_product_pricelist'多对一(type='many2one')关联到对象product.pricelist(relation='product.pricelist')。和many2one字段类型不同的是,many2one字段会在本对象中创建数据表字段'property_product_pricelist',property字段类型不会创建数据表字段'property_product_pricelist'。property字段类型会从数据表ir.property中查找name='property_product_pricelist'(即字段定义中的'product.pricelist'加上前缀property,并将"."替换成"
                "作为name)且company_id和本对象相同的记录,从该记录的value字段(value字段类型为reference)查得关联记录,如(product.pricelist,1),表示本对象的resource多对一关联到对象product.pricelist的id=1的记录。也就是说,property字段类型通过ir.property间接多对一关联到别的对象。
                    property字段类型基本上和many2one字段类型相同,但是有两种情况优于many2one字段。其一是,例如,当有多条记录通过ir.property的name='property_product_pricelist'的记录关联到记录(product.pricelist,1),此时,如果希望将所有关联关系都改成关联到记录(product.pricelist,2)。如果是many2one类型,不写代码,很难完成此任务,是property字段的话,只要将ir.property中的value值(product.pricelist,1)改成(product.pricelist,2),则所有关联关系都变了。修改ir.property的value值可以在系统管理下的菜单Configuration --> Properties中修改。其二是,例如,同一业务伙伴,但希望A公司的用户进来看到的该业务伙伴价格表为pricelistA,B公司的用户进来看到的该业务伙伴价格表为pricelistB,则many2one类型达不到该效果。property类型通过ir.property中的记录关联时加上了company_id的条件,因此可以使得不同公司的员工进来看到不同的关联记录。
                    由于property类型通过ir.property关联,因此,每个property类型的字段都必须在ir.property中有一条关联记录。这可以在安装时导入该条记录,参考代码如下:
                    <record model="ir.property" id="property_product_pricelist">
                        <field name="name">property_product_pricelist</field>
                        <field name="fields_id" search="[('model','=','res.partner'), ('name','=','property_product_pricelist')]"/>
                        <field name="value" eval="'product.pricelist,'+str(list0)"/>
                    </record>

                [b]字段定义的参数[/b]
                    字段定义中可用的参数有, change_default,readonly,required,states,string,translate,size,priority,domain,invisible,context,selection。
                [b]change_default[/b]:别的字段的缺省值是否可依赖于本字段,缺省值为:False。例子(参见res.partner.address),
                    'zip': fields.char('Zip', change_default=True, size=24),

                这个例子中,可以根据zip的值设定其它字段的缺省值,例如,可以通过程序代码,如果zip为200000则city设为“上海”,如果zip为100000则city为“北京”。

                [b]readonly[/b]: 本字段是否只读,缺省值:False。
                [b]required[/b]: 本字段是否必须的,缺省值:False。
                [b]states[/b]: 定义特定state才生效的属性,格式为:{'name_of_the_state': list_of_attributes},其中list_of_attributes是形如[('name_of_attribute', value), ...]的tuples列表。例子(参见account.transfer):
                    'partner_id': fields.many2one('res.partner', 'Partner', states={'posted':[('readonly',True)]}),

                [b]string[/b]: 字段显示名,任意字符串。
                [b]translate[/b]: 本字段值(不是字段的显示名)是否可翻译,缺省值:False。
                [b]size[/b]: 字段长度。
                [b]priority[/b]:
                [b]domain[/b]: 域条件,缺省值:[]。在many2many和many2one类型中,字段值是关联表的id,域条件用于过滤关联表的record。例子:
                'default_credit_account_id': fields.many2one('account.account', 'Default Credit Account', domain="[('type','!=','view')]"),

                本例表示,本字段关联到对象('account.account')中的,type不是'view'的record。

                [b]invisible[/b]: 本字段是否可见,即是否在界面上显示本字段,缺省值True。
                [b]selection[/b]: 只用于reference字段类型,参见前文reference的说明。

                1 条回复 最后回复
                0
                • J 离线
                  J 离线
                  Joshua 管理员
                  写于 最后由 编辑
                  #18

                  老肖辛苦了,function字段解析得很好.. 🙂

                  1.对于字段定义我看到fields.py里面还有个
                  [b]integer_big[/b] 在ORM里面对应的是'int8',不过好像没有过多的介绍了,在其他模块里面也不见到使用
                  平时我们的在PostgreSQL里面的integer虽然也够长的了..
                  [quote]integer 4 字节 常用的整数 -2147483648 到 +2147483647 [/quote]
                  不过好像真没见过使用

                  2.[b]selection[/b]:他也有function的store属性,作用也是在数据库里面保存这一字段,不过就算不显式写这个属性也会保存的...代码addons\account_voucher\account.py。另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?

                  3.[b]change_default[/b]:貌似有bug曾经测试过,如果一个view里面设了两个字段为change_default就不出来了。

                  4.[b]related[/b]:这个字段在之前partner源码分析的时候看过,继承自function,就像一个partner对应多个address,他会默认取第一个作为在partner tree里面显示出来的。
                  5.关于property,我看不明白这段代码
                  <field name="value" eval="'product.pricelist,'+str(list0)"/>
                  这个list0什么意思呢?

                  【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                  1 条回复 最后回复
                  0
                  • N 离线
                    N 离线
                    NewZN
                    写于 最后由 编辑
                    #19

                    谢谢 Joshua的补充!
                    > 另外一个问题就是function的store=true有没有意义呢,不是每次读取这个function就会执行里面的方法,那么还储存在数据库里面有什么作用?
                    我的理解是store=true可以将每次函数计算的结果存储到数据库中,这样有两个好处,一是便于DBA从数据库查看数据;二是非OpenERP的软件可以直接访问数据库共享数据。另外补充一点,fcnt_inv不限于写入本对象的数据表,更经常的情形是写入别的对象,甚至同时写入多个对象的数据表。

                    > <field name="value" eval="'product.pricelist,'+str(list0)"/>
                    前文说过,value字段类型为reference,即形如(product.pricelist,1)的值。这一行就是计算value的值,形如(product.pricelist,list0),list0(经导入后其值是数字)是引用的product.pricelist中的一条记录的id,如下。
                            <record id="list0" model="product.pricelist">
                                <field name="name">Default Purchase Pricelist</field>
                                <field name="type">purchase</field>
                            </record>
                    也就是说,在<field name="value" eval="'product.pricelist,'+str(list0)"/>之前,必须先有上述导入id="list0"的代码行。

                    1 条回复 最后回复
                    0
                    • N 离线
                      N 离线
                      NewZN
                      写于 最后由 编辑
                      #20

                          每个OpenERP的对象都有一些预定义方法,这些方法定义在基类osv.osv中。这些预定义方法有:
                      [b]基本方法[/b]:create, search, read, browse, write, unlink。
                          def create(self, cr, uid, vals, context={})
                          def search(self, cr, uid, args, offset=0, limit=2000)
                      def read(self, cr, uid, ids, fields=None, context={})
                      def browse(self, cr, uid, select, offset=0, limit=2000)
                      def write(self, cr, uid, ids, vals, context={})
                      def unlink(self, cr, uid, ids)

                      [b]缺省值存取方法[/b]:default_get, default_set。
                      def default_get(self, cr, uid, fields, form=None, reference=None)
                      def default_set(self, cr, uid, field, value, for_user=False)

                      [b]特殊字段操作方法[/b]:perm_read, perm_write
                      def perm_read(self, cr, uid, ids)
                      def perm_write(self, cr, uid, ids, fields)

                      [b]字段(fields)和视图(views)操作方法[/b]:fields_get, distinct_field_get, fields_view_get
                      def fields_get(self, cr, uid, fields = None, context={})
                      def fields_view_get(self, cr, uid, view_id=None, view_type='form',context={})
                      def distinct_field_get(self, cr, uid, field, value, args=[], offset=0,limit=2000)

                      [b]记录名字存取方法[/b]:name_get, name_search
                      def name_get(self, cr, uid, ids, context={})
                      def name_search(self, cr, uid, name='', args=[], operator='ilike',context={})

                      [b]缺省值存取方法[/b]:default_get, default_set
                      def name_get(self, cr, uid, ids, context={})
                      def name_search(self, cr, uid, name=, args=[], operator=’ilike’, context={})

                      create方法:在数据表中插入一条记录(或曰新建一个对象的resource)。
                      格式:def create(self, cr, uid, vals, context={})
                      参数说明:
                      vals: 待新建记录的字段值,是一个字典,形如: {'name_of_the_field':value, ...}
                      context (optional): OpenERP几乎所有的方法都带有参数context,context是一个字典,存放一些上下文值,例如当前用户的信息,包括语言、角色等。context可以塞入任何值,在action定义中,有一个context属性,在界面定义时,可以在该属性中放入任何值,context的最初值通常来自该属性值。
                      返回值:新建记录的id。
                      举例:id = pooler.get_pool(cr.dbname).get('res.partner.event').create(cr, uid,{'name': 'Email sent through mass mailing','partner_id': partner.id,'description': 'The Description for Partner Event'})

                      search方法:查询符合条件的记录。
                      格式:def search(self, cr, uid, args, offset=0, limit=2000)
                      参数说明:
                      args: 包含检索条件的tuples列表,格式为: [('name_of_the_field', 'operator', value), ...]。可用的operators有:
                        =, >, <, <=, >=
                        in
                        like, ilike
                        child_of
                      更详细说明,参考《OpenERP应用和开发基础》中的“域条件”有关章节。

                      · offset (optional): 偏移记录数,表示不返回检索结果的前offset条。
                      · limit (optional): 返回结果的最大记录数。
                      返回值:符合条件的记录的id list。

                      read方法:返回记录的指定字段值列表。
                      格式:def read(self, cr, uid, ids, fields=None, context={})
                      参数说明:
                      · ids: 待读取的记录的id列表,形如[1,3,5,...]
                      · fields (optionnal): 待读取的字段值,不指定的话,读取所有字段。
                      · context (optional): 参见create方法。
                      返回值:返回读取结果的字典列表,形如 [{'name_of_the_field': value, ...}, ...]

                      browse方法:浏览对象及其关联对象。从数据库中读取指定的记录,并生成对象返回。和read等方法不同,本方法不是返回简单的记录,而是返回对象。返回的对象可以直接使用"."存取对象的字段和方法,形如"object.name_of_the_field",关联字段(many2one等),也可以通过关联字段直接访问“相邻”对象。例如:
                          addr_obj = self.pool.get('res.partner.address').browse(cr, uid, contact_id)
                          nom = addr_obj.name
                          compte = addr_obj.partner_id.bank
                      这段代码先从对象池中取得对象res.partner.address,调用它的方法browse,取得id=contact_id的对象,然后直接用"."取得"name"字段以及关联对象patner的银行(addr_obj.partner_id.bank)。

                      格式:def browse(self, cr, uid, select, offset=0, limit=2000)
                      参数说明:
                      select: 待返回的对象id,可以是一个id,也可以是一个id 列表。
                      · offset (optional): 参见search方法。
                      · limit (optional): 参见search方法。
                      返回值:返回对象或对象列表。
                      注意:本方法只能在Server上使用,由于效率等原因,不支持rpc等远程调用。

                      write方法:保存一个或几个记录的一个或几个字段。
                      格式:def write(self, cr, uid, ids, vals, context={})
                      参数说明:
                      · ids: 待修改的记录的id列表。
                      · vals: 待保存的字段新值,是一个字典,形如: {'name_of_the_field': value, ...}。
                      · context (optional): 参见create方法。
                      返回值:如果没有异常,返回True,否则抛出异常。
                      举例:self.pool.get('sale.order').write(cr, uid, ids, {'state':'cancel'})

                      unlink方法:删除一个或几个记录。
                      格式:def unlink(self, cr, uid, ids)
                      参数说明:
                      · ids: 待删除的记录的id列表。
                      返回值:如果没有异常,返回True,否则抛出异常。


                      default_get方法:复位一个或多个字段的缺省值。
                      格式: def default_get(self, cr, uid, fields, form=None, reference=None)
                      参数说明:
                      • fields: 希望复位缺省值的字段列表。
                      • form (optional): 目前似乎未用(5.06版)。
                      • reference (optional): 目前似乎未用(5.06版)。
                      返回值: 字段缺省值,是一个字典,形如: {'field_name': value, ... }。
                      举例:self.pool.get('hr.analytic.timesheet').default_get(cr, uid, ['product_id','product_uom_id'])

                      default_set方法:重置字段的缺省值。
                      格式: def default_set(self, cr, uid, field, value, for_user=False)
                      参数说明:
                      • field: 待修改缺省值的字段。
                      • value: 新的缺省值。
                      • for_user (optional): 修改是否只对当前用户有效,还是对所有用户有效,缺省值是对所有用户有效。
                      返回值: True

                      1 条回复 最后回复
                      0
                      • J 离线
                        J 离线
                        Joshua 管理员
                        写于 最后由 编辑
                        #21

                        关于field.function我有其他问题,例如
                        sale这个模块里面的

                        <br />&#039;amount_untaxed&#039;: fields.function(_amount_all, method=True, digits=(16, int(config&#91;&#039;price_accuracy&#039;])), string=&#039;Untaxed Amount&#039;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; store = {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;sale.order&#039;: (lambda self, cr, uid, ids, c={}: ids, &#91;&#039;order_line&#039;], 10),<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &#039;sale.order.line&#039;: (_get_order, &#91;&#039;price_unit&#039;, &#039;tax_id&#039;, &#039;discount&#039;, &#039;product_uom_qty&#039;], 10),<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; },<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; multi=&#039;sums&#039;),<br />
                        


                        _get_order

                        <br />&nbsp; &nbsp; def _get_order(self, cr, uid, ids, context={}):<br />&nbsp; &nbsp; &nbsp; &nbsp; result = {}<br />&nbsp; &nbsp; &nbsp; &nbsp; for line in self.pool.get(&#039;sale.order.line&#039;).browse(cr, uid, ids, context=context):<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result[line.order_id.id] = True<br />&nbsp; &nbsp; &nbsp; &nbsp; return result.keys()<br />
                        


                        问题来了上面的代码是在sale.order里面的,他是根据sale.order.line的变化。而触发调不调用 _amount_all。但是_get_oeder里面的ids究竟是从何而来呢?是自动对应这个sale.order的sale.order.line吗?这里的_amount_all是任意一个sale.order.line变化就会触发,还是某个sale.order的sale.order.line变化才促发呢?

                        【上海先安科技】(joshua AT openerp.cn),欢迎关注公众号:openerp_cn

                        1 条回复 最后回复
                        0
                        • N 离线
                          N 离线
                          NewZN
                          写于 最后由 编辑
                          #22

                          > 问题来了上面的代码是在sale.order里面的,他是根据sale.order.line的变化。而触发调不调用 _amount_all。但是_get_oeder里面的ids究竟是从何而来呢?是自动对应这个sale.order的sale.order.line 吗?这里的_amount_all是任意一个sale.order.line变化就会触发,还是某个sale.order的 sale.order.line变化才促发呢?

                          这个问题太深入了,俺没深入调查源代码,只是凭经验回答。_get_order里面的ids从界面上来,是界面上当前Order的order.line的ids。因此,当前界面上的sale.order的任意一个 sale.order.line的变化,将会触发_amount_all的调用。

                          1 条回复 最后回复
                          0
                          • W 离线
                            W 离线
                            wjfonhand
                            写于 最后由 编辑
                            #23

                            sale.order.line有个比较讨厌的地方就是,他有单独的menu。这样用户可能不在订单header界面进去而是直接修改订单行。

                            估计这个store参数就是为了解决这个问题的

                            GoodERP -- Odoo China fork

                            1 条回复 最后回复
                            0
                            • K 离线
                              K 离线
                              K_Go
                              写于 最后由 编辑
                              #24

                              写的真好~~

                              1 条回复 最后回复
                              0
                              • C 离线
                                C 离线
                                codefans
                                写于 最后由 编辑
                                #25

                                原来楼主就是老肖

                                1 条回复 最后回复
                                0
                                • M 离线
                                  M 离线
                                  mf1389004071
                                  写于 最后由 编辑
                                  #26

                                  mark

                                  1 条回复 最后回复
                                  0
                                  • Z 离线
                                    Z 离线
                                    zx0800
                                    写于 最后由 编辑
                                    #27

                                    很好,mark

                                    1 条回复 最后回复
                                    0
                                    • H 离线
                                      H 离线
                                      hzren
                                      写于 最后由 编辑
                                      #28

                                      很好,mark

                                      1 条回复 最后回复
                                      0
                                      • 佳先生佳 离线
                                        佳先生佳 离线
                                        佳先生
                                        写于 最后由 编辑
                                        #29

                                        请问,text 可以显示长度吗??

                                        1 条回复 最后回复
                                        0
                                        • L 离线
                                          L 离线
                                          lindyue
                                          写于 最后由 编辑
                                          #30

                                          学习了

                                          1 条回复 最后回复
                                          0

                                          • 登录

                                          • 没有帐号? 注册

                                          • 登录或注册以进行搜索。
                                          • 第一个帖子
                                            最后一个帖子
                                          0
                                          • 版块
                                          • 标签
                                          • 热门
                                          • 用户
                                          • 群组