openerp (または同じ他のフィールド) で名前と同じ値を持つレコードを取得するにはどうすればよいですか?
4 に答える
Ruchirが提案したように、手動のSQLクエリを使用してグループ化するname
ソリューションは、おそらく最も単純ですが、少し低レベルです。read_group()
同様のクエリを実行するAPIメソッドを使用してこれを行うこともできGROUP BY
ますが、アクセス制御メカニズムとモデルビジネスロジックをバイパスする必要はありません。
このread_group
メソッドは、検索ドメイン(と同様search()
)、読み取るフィールドのリスト(と同様read()
)、およびグループ化するフィールドのリストを取ります。このメソッドは、OpenERPAPIで文書化されています。<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)