2012-07-04 2 views

ответ

10

Решение, связанное с использованием ручного SQL-запроса для группы по name, как предлагает Ruchir, возможно, является самым простым, но немного низким уровнем. Вы также можете сделать это, используя метод API read_group(), который выполняет аналогичный запрос GROUP BY, но не обходит механизмы управления доступом и модельную бизнес-логику.

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

Вы должны сначала прочитать документ первый: 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) 
+0

Вопрос заключался в том, чтобы найти записи, которые имеют повторяющиеся значения в некотором поле, например, имя. –

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) 

Теперь вы можете просматривать идентификаторы, которые мы получаем

our_objs = our_pool.browse(cr, uid, ids, context) 
+0

Вопрос заключался в том, как найти записи, которые имеют повторяющиеся значения в каком-либо поле, например имя. –

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(), чтобы получить результаты в виде списка кортежей, а не dicts.

Смежные вопросы