跳转至内容
  • Odoo的搜索功能

    Odoo 开发与实施交流 odoo技术
    3
    0 赞同
    3 帖子
    2k 浏览
    R
    @digitalsatori 感谢你的回复,打个比方,在高级搜索中,如果我想搜索Name中包含A或者B或者C的关键字,我需要点击好几次的添加条件。如果我有一张表格,上面有好几十个Name需要我去搜索,就会非常麻烦。
  • pip安装Odoo模块

    Odoo 培训 odoo 安装 odoo技术
    2
    0 赞同
    2 帖子
    3k 浏览
    厉害
  • 1 赞同
    1 帖子
    1k 浏览
    D
    在V13以前,我们可以用下面的方法来为浮点数字段设置预设的数字精度: import odoo.addons.decimal_precision as dp xxx = fields.Float(digits=dp.get_precision("Account")) 这个定义对用户很友好,这表示xxx字段可以使用一个叫Account的浮点数的小数点位数的定义。如果用户对xxx字段的精度不满意,就可以找到Account这个预设精度,改变精度值,xxx字段的精度也相应改变了。没有这个设计,改变浮点数精度必须依赖程序员修改代码。 V13把目前的这个定义方式淘汰了,变得更加简单: xxx = fields.Float(digits="Account") 注意没有了import, 和dp.get_precision
  • Selection字段的ondelete属性

    Odoo 培训 odoo技术 selection字段
    1
    0 赞同
    1 帖子
    1k 浏览
    D
    当我们在自己模块里继承了某个模型并且通过selection_add对这个模型的Selection类型字段添加了新的选项。系统中的记录也选择了我们定义的选项。然后,由于某些情况,我们需要卸载这个模块,那么这些选择了我们新的选项的记录这时候应该怎么处理,尤其是如果这个选项类型的字段还是“Required"的字段,那就更会引起错误了。 如fields.Many2one字段一样,为了处理fields.Selection出现上诉的问题,我们也要为这个字段添加ondelete属性。ondelete属性对应一个python字典。 当该字段的required=True时,ondelete属性是必须设置的,并且不能其值设置为null 比如: my_selection = fields.Selection(selection_add=[ ('pikachu', "Pikachu"), ('eevee', "Eevee"), ], ondelete={'pikachu': 'default', 'eevee': 'set bar'}) 从上面的例子可以看到,这个ondelete字典的key是新添的选项,其值就是当新添的选项删除时(模块卸载时)需要处理的动作,这些动作包括: 'null' --默认值,当对应选项删除时会将该字段的值设为False。如上所诉,当该字段的required=True时ondelete不能使用这个动作。 'cascade' -- 所有选择当前选项的记录,当选项被删除时,记录一并被删除。 'default' -- 选择该选项的所有记录,当选项被删除时,该字段恢复为默认值。 'set ' -- 选择该选项的所有记录,当选项被删除时,该字段的值设为这里的设定值,这里的设定值必须有效存在。 <callable> -- 可以定义一个方法来返回结果,这个函数只有一个唯一参数对应所有包含该选项的记录。
  • 1 赞同
    1 帖子
    1k 浏览
    D
    我们知道Odoo的Selection字段的选项值为包含多个元组的一个列表,其中每个元组包含两个字符串成员,第一个成员为内部保存值,第二个用来界面显示,比如 class TestModel(model.Model): _name = 'test.model' myselection = fields.Selection([('a', 'A'), ('b', 'B')], string='MySelection') 当在新的模块里需要继承修改这个Selection字段的选项时,我们可以使用selection_add, 比如: class TestModel(model.Model): _inherit = 'test.model' myselection = fields.Selection(selection_add=[('c', 'C')]) 问题是这样的继承得到的结果是[('a', 'A'), ('b', 'B'), ('c', 'C')],新添加的选项在列表的尾端。那有没有办法指定新添加选项在列表中的位置呢?在Odoo13以后实际上我们可以在选项值后面添加由单个成员组成的元组来确认新选项的插入位置,比如上例中: selection_add = [('c', 'C'), ('b',)] > result = [('a', 'A'), ('c', 'C'), ('b', 'B')]
  • 计算字段中的compute_sudo

    Odoo 培训 odoo技术 compute字段
    1
    0 赞同
    1 帖子
    1k 浏览
    D
    我们在定义一个计算字段时往往会忽略这个计算字段被触发重算的环境。尤其是这个字段depends其它对象的字段,或者我们的运行环境是 多公司的环境。这时候很可能一个没有权限用户对某个字段的修改触发了计算字段的重算,但是因为权限关系这个重算无法完成,从而会出现权限错误。 当你在遇到这种情况时,就要考虑给计算字段加compute_sudo的属性,比如: total_cost = fields.Float('Total Cost', compute='_compute_total', store=True, compute_sudo=True) 注意这种用法只对,store=True的计算字段有效。
  • Odoo的异步队列神器-queue_job

    Odoo 培训 odoo技术 异步队列 queuejob
    19
    0 赞同
    19 帖子
    13k 浏览
    H
    @hui 请问,新建库重启问题如何处理的?有解决方案吗?
  • Odoo部署的服务器配置选择

    Odoo 培训 odoo技术 odoo部署
    1
    0 赞同
    1 帖子
    2k 浏览
    D
    Odoo默认工作在“线程”模式下。当并发用户增加时,线程模式因为Python的GIL全局锁的限制,导致它无法分配现今多核服务器的其它内核来处理运算请求。所以,当有比较多的并发用户时,我们要将Odoo设置为“多进程”的模式,以充分利用服务器多核的计算资源。 所谓让Odoo工作在“多进程模式“,就是给启动参数workers设置一个非0的数值,那设多少合适呢? 首先,我们要知道:一个worker大致能并发处理6~10用户请求,所以比如60用户并发,那就大致需要配置10个worker Odoo的worker的值的设置还与服务器的内核数量有关,因为这些worker的负载最后是要由CPU内核运算单元来消化的。所以比如一个普通的单CPU,4核服务器,可以支持的workers的数量就是 2 * Cores + 1 = 9, 8个http worker, 1个cron job worker。 与上面的10个worker的需求接近,所以处理60用户并发我们可以选一台拥有4核的服务器,Odoo配置: workers = 8 max_cron_threads = 1 那么内存应该配置多少呢?一般一个任务繁重的worker占用1G内存,而大多数轻载的worker占用内存为150M左右。而在实际的应用中遵守2/8法则,即重载worker和轻载worker的存在比例时20%/80%, 所以9个worker的内存需求为: 9 * (0.8 * 150 + 0.2 * 1024)≂ 3 G RAM 由此可以看出,Odoo还是一个并不怎么消耗服务器资源的平台。
  • 0 赞同
    2 帖子
    3k 浏览
    H
    @digitalsatori 我就本地测试的话,不用nginx,有办法处理掉这个错误吗?
  • Odoo的Binary字段如何设置默认值?

    Odoo 培训 binary field odoo技术
    1
    0 赞同
    1 帖子
    1k 浏览
    D
    Odoo的Binary字段默认保存的是Base64转码后的字符串。那么我们该如何为Binary字段设置默认值呢?比如一个默认的图片。答案当然是将图片文件的内容用Base64转码后赋给这个字段的default属性。 方法1 : 比如你可以把一个图片用在线工具转码为Base64格式字符串: data:image/png;base64,iVRORw0KGgoBBBNSUhEUgAAAAEAAAABCAIAAACQd1PeAAAA..................... 去掉头部的data:image/png;base64,信息,把剩余的内容保存为默认值 DEFAULT_IMG = 'iVRORw0KGgoBBBNSUhEUgAAAAEAAAABCAIAAACQd1PeAAAA.....................' class MyModel(models.Model): _name = 'my.model' field_binary = fields.Binary(default=DEFAULT_IMG) 方法2: 将图片文件保存在模块目录下,比如: /my_module/static/img/my_image.png 设置默认值: import base64 from odoo import models, fields from odoo import modules def get_default_img(): with open(modules.get_module_resource('my_module', 'static/img', 'my_image.png'), 'rb') as f: return base64.b64encode(f.read()) class MyModel(models.Model): _name = 'my.model' field_binary = fields.Binary(default=get_default_img())
  • Odoo的Binary字段如何保存文件名

    Odoo 培训 odoo技术 binary field
    1
    0 赞同
    1 帖子
    1k 浏览
    D
    我们定义一个fields.Binary类型的字段就可以上传文件并保存。但是,这仅仅保存了文件的内容,下载时的文件的名称为该模型的名称而不是原上传文件的文件名。我们在代码中也无法引用该上传文件的文件名。那我们如何才能做到既保存上传文件的文件内容又保存其文件名呢? 首先, 我们要另外定义一个保存文件名的字符字段,比如 test_img = fields.Binary('Test Image') test_img_file_name = fields.Char('File name') 然后在视图中跟Binary字段做关联: <field name="test_img" filename="test_img_file_name"/> <field name="test_img_file_name" invisible="1"/>
  • 如何下载Odoo的Binary字段的文件内容

    Odoo 培训 binary field odoo技术
    1
    1
    0 赞同
    1 帖子
    1k 浏览
    D
    这个问题似乎很奇怪,当然是在对象表单视图的对应字段上点击那个下载按钮: [image: 1572574611168-image_btn.png] 但是,比如我有一个需求,需要创建一个下载所有的对象的Binary字段中的文件的页面,该如何做呢? 实际上对象上的Binary对象的链接是下面这样的: http://127.0.0.1:8069/web/content?model=<module_name>&field<field_name>&filename_field=<field_filename>&id=<object_id> 其中: module_name - Binary字段对应的模型名称 field_name - Binary字段的名称 object_id - 对应的记录id. field_filename - Binary字段对应的文件名称的字段(非必选项) 所以我们要创建一个按钮,点击下载文件的代码如下: file_url = "http://127.0.0.1:8069/web/content?model=<module_name>&field=<field_name>&filename_field=<field_filename>&id=<object_id>" return { 'type': 'ir.actions.act_url', 'url': file_url, 'target': 'new' } 而在Qweb报表或web页面中,我们可以这样处理: <t t-foreach="files" t-as="f"> <tr> <td><t t-esc="f.name"/></td> <td><a t-attf-href="/web/content?model=<module_name>&field=<field_name>&filename_field=<field_filename>&id=<object_id>">Download</a></td> </tr> </t>
  • Odoo的XML-ID

    Odoo 培训 xml-id 外部id odoo技术
    3
    0 赞同
    3 帖子
    2k 浏览
    D
    哈哈,还真有人回应我的问题。 这句话是关键: 事实上你所定义的模型和字段也有自己的XML-ID的 你的截图中的XML-ID对应的是保存在res_partner表中的一条记录。而sale.field_sale_order__partner_id 对应的是保存在ir_model_fields表中的一条记录。 你现在应该能说得清这条记录的含义了吧?