odoo域搜索“ ID中的ID”

时间:2018-07-30 19:31:51

标签: database odoo odoo-11

我有一个模型B,该模型具有一个引用模型A的Many2many字段。 现在给定模型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]

但是,我想避免获取不需要的记录,并希望让数据库进行过滤。

2 个答案:

答案 0 :(得分:2)

您应该在A中创建等效的Many2many字段。

RFID_UID

在字段定义中,第二个参数是关联表的名称,接下来的两个是引用两个模型的记录的列的名称。在官方ORM文档中对此进行了解释。 然后,您只需要执行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')

如果由于不想将python字段添加到A而希望执行SQL请求,则可以通过调用my_a_record.b_ids来实现。在您的请求中,您必须加入关联表(因此,您需要为其名称及其列指定一个名称,如我的代码摘录中所述,否则它们将由Odoo自动命名,并且我不知道该规则)。

我认为在A中没有该字段的情况下仍然可以使用搜索域,但这很棘手。您可以尝试self.env.cr.execute("select id from module_b b, ...").fetchall(),但我不确定。

答案 1 :(得分:0)

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)])