如何在 openerp (或相同的其他字段)中检索具有相同 name 值的记录?
4 回答
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)
您可以通过直接 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()
将结果作为元组列表而不是字典来获取。
如果您有要搜索的字段“名称”的特定值,则要搜索的域是
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)
您应该首先阅读文档: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)