如何在openerp(或其他相同字段)中检索具有相同名称值的记录?
答案 0 :(得分:10)
根据Ruchir的建议,使用手动SQL查询按name
分组的解决方案可能是最简单的,但有点低级。您也可以使用执行类似read_group()
查询的GROUP BY
API方法,但不绕过访问控制机制和模型业务逻辑。
read_group
方法采用搜索域(类似于search()
),要读取的字段列表(类似于read()
)和要分组的字段列表。 OpenERP API中记录了此方法。
它返回一个有序的字典列表,其中包含分组数据和一些额外值,包括每个组中的记录数,存储在名为<grouped_field>_count
的密钥中,您可以使用它来查找重复项。
例如,如果您查找重复的name
值,而没有任何其他搜索条件:
def duplicate_names(self, cr, uid, context=None):
# Note: context not propagated for brevity of example
groups = self.read_group(cr, uid, [], ['name'], ['name'])
duplicate_names = [g['name'] for g in groups if g['name_count'] > 1]
print "Duplicates names:", duplicate_names
if duplicate_names:
# It's easy to find out the IDs of duplicate records for each name,
# here is for the first one
duplicate_ids = self.search(cr, uid, [('name', '=', duplicate_names[0])])
print "Duplicate IDs for %r: %s" % (duplicate_names[0], duplicate_ids)
答案 1 :(得分:4)
您可以在数据库中找到带有直接SQL查询的重复记录。例如,您可以在联系地址中找到重复的名称:
cr.execute("""
SELECT name, id, partner_id FROM res_partner_address
WHERE name in (SELECT name
FROM res_partner_address
GROUP BY name
HAVING (COUNT(name) > 1))""")
print cr.dictfetchall()
您可以使用cr.dictfetchall()
将结果作为元组列表而不是dicts来代替cr.fetchall()
。
答案 2 :(得分:0)
如果您要搜索字段“name”的特定值,则要搜索的域
domain = [('name', '=', your_value)]
如果您有要搜索的值列表,那么
domain = [('name', 'in', list_of_values)]
如果您想搜索具有相似值的字段'name',那么
domain = [('name','ilike',your_value)]
现在你可以搜索
our_pool = self.pool.get('your.obj.name')
ids = our_pool.search(cr, uid, domain, context=context)
现在您可以浏览我们获得的ID
our_objs = our_pool.browse(cr, uid, ids, context)
答案 3 :(得分:-1)
您应该先阅读文档:http://doc.openerp.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html
对于这个问题,您首先需要“搜索”,然后是“浏览”(或“阅读”),例如:
obj = self.pool.get('your.obj.name')
ids = obj.search(cr, uid, [('name','=',your_value)], context=context)
records = obj.browse(cr, uid, ids, context=context)