2

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

4

4 回答 4

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)
于 2012-07-05T08:52:12.267 回答
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()您可以使用cr.fetchall()将结果作为元组列表而不是字典来获取。

于 2012-07-05T05:24:58.140 回答
0

如果您有要搜索的字段“名称”的特定值,则要搜索的域是

domain = [('name', '=', your_value)]

如果您有要搜索的值列表,那么

domain = [('name', 'in', list_of_values)]

如果您想搜索具有相似值的字段“名称”,那么

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)
于 2012-07-05T05:24:45.450 回答
-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)
于 2012-07-05T03:50:14.980 回答