Reputation: 191
How can I retrieve records that have the same value of name in openerp (or same other field)?
Upvotes: 2
Views: 5475
Reputation: 805
You can find duplicate records with a direct SQL query in the database. As an example, this is how you can find duplicate names in the Contact Addresses:
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()
Instead of cr.dictfetchall()
you can use cr.fetchall()
to get the results as a list of tuples rather than dicts.
Upvotes: 4
Reputation: 4117
The solution of using a manual SQL query to group by name
as suggested by Ruchir is probably the simplest, but a bit low-level. You can also do it using the read_group()
API method that performs a similar GROUP BY
query, but without bypassing access control mechanisms and model business logic.
The read_group
method takes a search domain (similarly to search()
), a list of fields to read (similarly to read()
) and a list of fields to group by. This method is documented in the OpenERP API.
It returns an ordered list of dictionaries with the grouped data and some extra values, including the number of record in each group, stored in a key named <grouped_field>_count
, which you could use to find duplicates.
For example if you look for duplicate name
values, without any other search criterion:
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)
Upvotes: 10
Reputation: 5044
If you have a specific value for a field 'name' to be searched, then the domain to be searched is
domain = [('name', '=', your_value)]
If you have a list of values to be searched then
domain = [('name', 'in', list_of_values)]
If you want to search a field 'name' with similar value then
domain = [('name','ilike',your_value)]
Now you can search
our_pool = self.pool.get('your.obj.name')
ids = our_pool.search(cr, uid, domain, context=context)
Now you can browse the ids we get
our_objs = our_pool.browse(cr, uid, ids, context)
Upvotes: 0
Reputation: 780
You should first read the document first: http://doc.openerp.com/v6.0/developer/2_5_Objects_Fields_Methods/methods.html
For this question you will need first a 'search' then a 'browse' (or 'read') for example:
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)
Upvotes: -1