odoo 域搜索 "id in ids"
odoo domain search "id in ids"
我有一个带有 Many2many 字段引用模型 A 的模型 B。
现在给定模型 A 的 id,我尝试获取引用它的 B 的记录。
Odoo 搜索域是否可行?是否可以做一些 SQL 查询?
例子
class A(models.Model):
_name='module.a'
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('m.a')
我尝试做类似
的事情
a_id = 5
filtered_b_ids = self.env['module.b'].search([(a_id,'in','a_ids')])
但是,这不是 Odoo 中的有效搜索。有没有办法让数据库进行搜索?
到目前为止,我从数据库中获取 B 的所有记录,然后过滤它们:
all_b_ids = self.env['module.b'].search([])
filtered_b_ids = [b_id for b_id in b_ids if a_id in b_id.a_ids]
但是,我想避免获取不需要的记录,并希望让数据库进行过滤。
您应该在 A 中创建等效的 Many2many 字段。
class A(models.Model):
_name='module.a'
b_ids = fields.Many2many('module.b', 'rel_a_b', 'a_id', 'b_id')
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('module.a', 'rel_a_b', 'b_id', 'a_id')
在字段定义中,第二个参数是关联的名称table,接下来的两个参数是引用两个模型记录的列的名称。它在官方 ORM 文档中有解释。
然后你只需要做 my_a_record.b_ids
.
如果您因为不想向 A 添加 python 字段而更喜欢执行 SQL 请求,则可以通过调用 self.env.cr.execute("select id from module_b b, ...").fetchall()
来实现。在您的请求中,您必须加入协会 table(因此您需要为其及其列指定一个名称,如我的代码摘录中所述,否则它们将由 Odoo 自动命名,我不知道规则).
我认为仍然可以在 A 中没有字段的情况下使用搜索域,但这很棘手。你可以试试 search([('a_ids','in', [a_id])])
但我真的不确定。
class A(models.Model):
_name='module.a'
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('module.a')
现在你要搜索a_id = 5
为此,只需使用浏览或搜索 ORM 方法即可,即
a_id = 5
filtered_b_ids = self.env['module.b'].search([(a_id,'in',self.a_ids.ids)])
或
a_id = 5
filtered_b_ids = self.env['module.a'].search([(a_id)])
我有一个带有 Many2many 字段引用模型 A 的模型 B。 现在给定模型 A 的 id,我尝试获取引用它的 B 的记录。
Odoo 搜索域是否可行?是否可以做一些 SQL 查询?
例子
class A(models.Model):
_name='module.a'
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('m.a')
我尝试做类似
的事情a_id = 5
filtered_b_ids = self.env['module.b'].search([(a_id,'in','a_ids')])
但是,这不是 Odoo 中的有效搜索。有没有办法让数据库进行搜索? 到目前为止,我从数据库中获取 B 的所有记录,然后过滤它们:
all_b_ids = self.env['module.b'].search([])
filtered_b_ids = [b_id for b_id in b_ids if a_id in b_id.a_ids]
但是,我想避免获取不需要的记录,并希望让数据库进行过滤。
您应该在 A 中创建等效的 Many2many 字段。
class A(models.Model):
_name='module.a'
b_ids = fields.Many2many('module.b', 'rel_a_b', 'a_id', 'b_id')
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('module.a', 'rel_a_b', 'b_id', 'a_id')
在字段定义中,第二个参数是关联的名称table,接下来的两个参数是引用两个模型记录的列的名称。它在官方 ORM 文档中有解释。
然后你只需要做 my_a_record.b_ids
.
如果您因为不想向 A 添加 python 字段而更喜欢执行 SQL 请求,则可以通过调用 self.env.cr.execute("select id from module_b b, ...").fetchall()
来实现。在您的请求中,您必须加入协会 table(因此您需要为其及其列指定一个名称,如我的代码摘录中所述,否则它们将由 Odoo 自动命名,我不知道规则).
我认为仍然可以在 A 中没有字段的情况下使用搜索域,但这很棘手。你可以试试 search([('a_ids','in', [a_id])])
但我真的不确定。
class A(models.Model):
_name='module.a'
class B(models.Model):
_name='module.b'
a_ids = fields.Many2many('module.a')
现在你要搜索a_id = 5 为此,只需使用浏览或搜索 ORM 方法即可,即
a_id = 5
filtered_b_ids = self.env['module.b'].search([(a_id,'in',self.a_ids.ids)])
或
a_id = 5
filtered_b_ids = self.env['module.a'].search([(a_id)])