首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

避免在odoo8中重复many2many中的记录

在odoo8中,避免重复many2many中的记录可以通过以下几种方式实现:

  1. 使用_sql_constraints约束:在many2many字段的模型中,可以通过添加_sql_constraints约束来避免重复记录。具体步骤如下:
    • 在many2many字段所在的模型中,定义一个方法来检查重复记录。
    • _sql_constraints中添加一个约束,调用上述方法来检查重复记录。

例如,假设有一个模型ModelA,其中有一个many2many字段m2m_field,可以按照以下方式避免重复记录:

代码语言:python
代码运行次数:0
复制

class ModelA(models.Model):

代码语言:txt
复制
   _name = 'model.a'
代码语言:txt
复制
   m2m_field = fields.Many2many('model.b', 'model_a_b_rel', 'model_a_id', 'model_b_id', string='Many2Many Field')
代码语言:txt
复制
   @api.constrains('m2m_field')
代码语言:txt
复制
   def _check_duplicate_records(self):
代码语言:txt
复制
       for record in self:
代码语言:txt
复制
           if len(record.m2m_field) != len(set(record.m2m_field.ids)):
代码语言:txt
复制
               raise ValidationError("Duplicate records found in Many2Many field!")
代码语言:txt
复制
   _sql_constraints = [
代码语言:txt
复制
       ('unique_m2m_field', 'CHECK(1=1)', 'Duplicate records found in Many2Many field!')
代码语言:txt
复制
   ]
代码语言:txt
复制

在上述示例中,_check_duplicate_records方法用于检查重复记录,如果发现重复记录,则会抛出一个验证错误。_sql_constraints约束中的CHECK(1=1)用于触发约束,调用上述方法进行检查。

  1. 使用unique属性:在many2many字段的模型中,可以通过设置unique属性为True来避免重复记录。具体步骤如下:
    • 在many2many字段的定义中,添加unique=True属性。

例如,假设有一个模型ModelA,其中有一个many2many字段m2m_field,可以按照以下方式避免重复记录:

代码语言:python
代码运行次数:0
复制

class ModelA(models.Model):

代码语言:txt
复制
   _name = 'model.a'
代码语言:txt
复制
   m2m_field = fields.Many2many('model.b', 'model_a_b_rel', 'model_a_id', 'model_b_id', string='Many2Many Field', unique=True)
代码语言:txt
复制

在上述示例中,通过设置unique=True属性,确保了many2many字段中的记录是唯一的。

  1. 使用@api.depends装饰器:在many2many字段的模型中,可以通过使用@api.depends装饰器来自动过滤重复记录。具体步骤如下:
    • 在many2many字段所在的模型中,定义一个计算字段,使用@api.depends装饰器。
    • 在计算字段的方法中,使用self.env['model.b'].search([])来获取所有相关记录,并通过filtered方法过滤掉重复记录。

例如,假设有一个模型ModelA,其中有一个many2many字段m2m_field,可以按照以下方式避免重复记录:

代码语言:python
代码运行次数:0
复制

class ModelA(models.Model):

代码语言:txt
复制
   _name = 'model.a'
代码语言:txt
复制
   m2m_field = fields.Many2many('model.b', 'model_a_b_rel', 'model_a_id', 'model_b_id', string='Many2Many Field')
代码语言:txt
复制
   filtered_m2m_field = fields.Many2many('model.b', compute='_compute_filtered_m2m_field', string='Filtered Many2Many Field')
代码语言:txt
复制
   @api.depends('m2m_field')
代码语言:txt
复制
   def _compute_filtered_m2m_field(self):
代码语言:txt
复制
       for record in self:
代码语言:txt
复制
           record.filtered_m2m_field = self.env['model.b'].search([('id', 'in', record.m2m_field.ids)])
代码语言:txt
复制
   _sql_constraints = [
代码语言:txt
复制
       ('unique_m2m_field', 'CHECK(1=1)', 'Duplicate records found in Many2Many field!')
代码语言:txt
复制
   ]
代码语言:txt
复制

在上述示例中,通过定义计算字段filtered_m2m_field,并使用@api.depends装饰器,实现了自动过滤重复记录的功能。计算字段的方法_compute_filtered_m2m_field使用self.env['model.b'].search([])获取所有相关记录,并通过filtered方法过滤掉重复记录。

以上是在odoo8中避免重复many2many中的记录的几种方法。根据具体需求和场景,可以选择适合的方式来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • SQL:删除表重复记录

    insert test select from # --删除新表 drop table # --查看结果 select from test 查找表多余重复记录重复记录是根据单个字段...peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)  2、删除表多余重复记录...rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)  3、查找表多余重复记录...and rowid not in (select min(rowid) from vitae group by peopleId,seq having count()>1)  5、查找表多余重复记录...表存在一个字段“name”,而且不同记录之间“name”值有可能会相同,  现在就是需要查询出在该表记录之间,“name”值存在重复项;  Select Name,Count() From

    4.8K10

    【DB笔试面试469】Oracle如何删除表重复记录

    题目部分 Oracle如何删除表重复记录? 答案部分 平时工作可能会遇到这种情况,当试图对表某一列或几列创建唯一索引时,系统提示ORA-01452 :不能创建唯一索引,发现重复记录。...这个时候只能创建普通索引或者删除重复记录后再创建唯一索引。 重复数据可能有这样两种情况:第一种是表只有某些字段一样,第二种是两行记录完全一样。...删除重复记录结果也分为两种,第一种是重复记录全部删除,第二种是重复记录只保留最新一条记录一般业务,第二种情况较多。...1、删除重复记录方法原理 Oracle,每一条记录都有一个ROWID,ROWID整个数据库是唯一,ROWID确定了每条记录Oracle哪一个数据文件、块、行上。...重复记录,可能所有列上内容都相同,但ROWID不会相同,所以,只要确定出重复记录那些具有最大ROWID就可以了,其余全部删除。

    2.7K30

    经验:MySQL数据库,这4种方式可以避免重复插入数据!

    作者:小小猿爱嘻嘻 wukong.com/question/6749061190594330891/ 最常见方式就是为字段设置主键或唯一索引,当插入重复数据时,抛出错误,程序终止,但这会给后续处理带来麻烦...02 on duplicate key update 即插入数据时,如果数据存在,则执行更新操作,前提条件同上,也是插入数据字段设置了主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据...03 replace into 即插入数据时,如果数据存在,则删除再插入,前提条件同上,插入数据字段需要设置主键或唯一索引,测试SQL语句如下,当插入本条记录时,MySQL数据库会首先检索已有数据(idx_username...,这种方式适合于插入数据字段没有设置主键或唯一索引,当插入一条数据时,首先判断MySQL数据库是否存在这条数据,如果不存在,则正常插入,如果存在,则忽略: ?...目前,就分享这4种MySQL处理重复数据方式吧,前3种方式适合字段设置了主键或唯一索引,最后一种方式则没有此限制,只要你熟悉一下使用过程,很快就能掌握,网上也有相关资料和教程,介绍非常详细,感兴趣的话

    4.5K40

    Rdfind - Linux查找重复文件

    背景 前段时间遇到一个问题,服务器下面一个文件夹下面的图片越来越多,由原来5G,达到了现在94G,其中这个文件夹下面有好多重复图片,文件多了之后造成图片备份困难,图片迁移困难,浪费了大量空间和IO...本文中将介绍rdfind命令工具linux查找和删除重复文件,使用之前请先在测试环境跑通并对测试环境进行严格测试,测试通过之后再在生产环境进行操作,以免造成重要文件丢失,数据是无价。...Rdfind来自冗余数据查找,用于多个目录或者多个文件查找重复文件,它使用校对和并根据文件查找重复项不仅包含名称。 Rdfind使用算法对文件进行分类,并检测那些是重复文件,那些是文件副本。...root@ds Image]# drfind /Image/ [root@ds Image]# Rdfind 命令将扫描 /Image 目录,并将结果存储到当前工作目录下一个名为 results.txt 文件...你可以 results.txt 文件中看到可能是重复文件名字。 通过检查 results.txt 文件,你可以很容易找到那些重复文件。如果愿意你可以手动删除它们。

    5.2K60

    IGNORE,REPLACE,ON DUPLICATE KEY UPDATE避免重复插入记录时存在问题及最佳实践

    实际业务场景,经常会有这样需求:插入一条记录,如果数据表已经存在该条记录则更新它部分字段,比如更新update_time或者某些列上执行累加操作等。...参考博客1介绍了三种MySQL避免重复插入记录方法,本文将在简单介绍这三种用法基础上,深入分析这其各自存在问题,最后给出在实际生产环境对该业务场景最佳实践。...; 当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时,从表删除含有重复关键字值(所有)冲突行 ; 再次尝试把新行插入到表 。...其中和record1是A键上冲突,和record2是B键上冲突,那么Innodb最终只会返回这两条重复记录一条,并最终更新返回这条记录。而且更重要是,到底返回哪一条是不确定。...开启事务,事务先执行普通insert语句,如果抛出重复键异常DuplicateKeyException(Java语言)时,catch异常先执行先执行select语句,再执行update语句方式

    2.1K23

    【译】如何避免JavaScript阻塞DOM

    原文链接:https://www.sitepoint.com/avoiding-dom-blocking/ 浏览器和在诸如Node.js运行时环境,JavaScript程序是运行在单线程上。...例如:当一个按钮被点击后触发了一个事件,这个事件执行一个函数,函数内进行了一些计算并更新DOM。一旦完成,浏览器便空闲下来,从任务队列取出下一个任务来处理。...内存存储 更新内存对象要比使用写入磁盘存储机制快得多。选择CodePenobject存储类型然后点击write。...一个好折衷办法是使用内存对象来提高性能,然后合适时机对数据进行持久化——例如在卸载页面时: // get previously-saved data var store = JSON.parse...此外,幸运是,无法避免长时间运行任务情况下,也存在一些选项可供开发者选择。 用户和客户们可能永远不会注意到你所做速度优化,但当应用程序变慢时,他们总是会抱怨!

    2.8K10

    .Net Core记录日志

    一个完善系统,必然会有非常完善日志记录,用户操作、系统运行状况等信息被完整记录下来,方便我们对系统进行维护和改进。.net core 也为日志记录提供了内置支持。...控制台程序记录日志 本段内容摘自《.NET Core控制台应用程序中使用日志》,作者非常详细介绍了如何在控制台应用程序中使用内置日志记录功能。...Core应用记录日志 由于IWebHostBuilder.CreateDefaultBuilder()方法,系统已经帮我们初始化了日志组件,因此我们可以直接使用ILogger进行注入。...,.NetCore,日志等级分为以下几种: Trace = 0,记录跟踪信息 Debug = 1,记录调试信息 Information = 2,记录常规信息 Warning = 3,记录警告信息,通常为...} } } } 参考文档 .NET Core控制台应用程序中使用日志 玩转ASP.NET Core日志组件

    1.2K20

    Web机器人记录访问地和避免动态虚拟web空间循环和重复

    当需要进行检测URL是否重复时候,只需要将这个URL进行Hash映射,如果得到地址已经存在,说明已经被下载过,放弃下载,否则,将该URL及其Hash地址作为键值对存放到Hash表。...这样,URL去重存储库就是要维护一个Hash表,如果Hash函数设计不好,进行映射时候,发生碰撞几率很大,则再进行碰撞处理也非常复杂。...而且,这里使用是URL作为键,URL字符串也占用了很大存储空间。 爬虫策略 – 广度优先搜索   广度优先策略是指在抓取过程完成当前层次搜索后,才进行下一层次搜索。...该算法设计和实现相对简单。目前为覆盖尽可能多网页,一般使用广度优先搜索方法。也有很多研究将广度优先搜索策略应用于聚焦爬虫。...全链接爬取时如何记录已经访问过url: so: and 已知服务器信息时,如何过滤存在别名url地址: such as: so: 如何避免动态虚拟web空间循环和重复

    44410

    货币计算应该避免浮点数

    当我们重复地使用这两种数据类型进行算术运算(乘或除)时,这个问题严重性就变得非常显著(称为显著性损失)。下面,我们将展示这可能是什么样子。...这是精度损失(或意义损失)。 损失原因 浮点算术 计算,浮点运算(FP)是一种使用公式化实数表示法作为近似来支持范围和精度之间权衡算法。...例如,base-10,1/2有一个终止展开(0.5),而1/3没有(0.333…)。base-2,只有分母是2幂(如1/2或3/16)理性终止。...)存储BigDecimal实例。...如何格式化BigDecimal值而不获得结果求幂并去掉后面的0呢如果我们使用BigDecimal时没有遵循一些最佳实践,我们可能会在计算结果得到求幂。

    2.5K30

    避免云迁移过程宕机

    公共云迁移期间,IT团队需要采取谨慎步骤,以避免听到“系统宕机”这种可怕提示。 随着组织迁移到基于云计算基础设施,IT团队需要在迁移过程中保持可用性。...但是,考虑到所有复杂性,云计算迁移过程,防止宕机或最小化停机时间并不容易。云计算团队需要考虑数据不一致,监控不同软件版本,并检查其网络连接是否成功。 如果企业应用程序崩溃,业务往往会停止。...虽然精确指标因企业和应用情况而异,但调研机构Gartner公司2014年发现,网络停机时间平均每分钟损失为5,600美元。...迁移过程,同时运行内部部署和云系统,同步数据并测试云部署,以确保转移过程没有任何内容丢失。另外,记录所有的API,以了解云迁移过程需要监视哪些API。...定制和网络带来迁移挑战 区分企业服务或简化操作定制应用程序云迁移过程创造了额外挑战。当企业修改应用程序时,通常会创建一个附加组件或编写软件。

    896100

    Andorid 为什么要避免「内存抖动」?

    内存抖动是指内存频繁分配和回收,占用内存忽高忽低,内存占用图形上呈现锯齿状 Android 开发过程,你一定听说过「内存抖动」这个词,别人肯定也告诫过你要避免内存抖动,但是为什么呢?...但是其实初步想,为什么要避免内存抖动呢?频繁创建对象,被 Java 虚拟机回收机制自动回收了,这不是挺好吗?开发者为什么还需要关心这个问题呢?...下面讲一下原因 1.频繁 GC 会导致卡顿 传统 GC 模式下,当虚拟机触发一次 GC,会先暂停所有线程。当频繁 GC 这样 Android 主线程会被频繁暂停,势必会引发卡顿。...2.GC 会导致内存碎片化 传统 GC 模式下,回收一次后,会导致内存碎片化,即导致很多内存块不连续,导致寻址变慢拖慢程序。...极端情况,内存碎片化严重,这也导致无法为新对象申请一块连续内存,极大降低对内存利用率。 Google 为了缓解上面的问题,引入了 ART 虚拟机。但是也不能完全避免上述问题。

    1.1K10

    Java如何避免“!=null”式判空语句?

    Java开发中最常用一段代码就是用object != null使用对象之前判断是否为空。这么做是为了避免NullPointerException。...= null) { someobject.doCalc(); } 这么些我是为了避免抛NullPointerException异常,我不知道这个对象是不是空。...语法如下: assert ** 或者是 assert ** : ** objecttoString()输出会被包括错误信息。...这就意味着可以开发测试过程来使用断言验证代码,而在生产环境就关闭这个特性,尽管我已经测试显示断言功能并不会对应用程序产生任何影响。...其实在findAction()方法中直接抛出更加有意义错误信息是完全可以。特别是你依赖用户输入应用

    2.2K10
    领券