OpenERP:获取具有相同名称的记录

时间:2012-07-04 22:17:32

标签: python openerp

如何在openerp(或其他相同字段)中检索具有相同名称值的记录?

4 个答案:

答案 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)