OpenERP (python) - 条件搜索记录ID?

0 投票
1 回答
2167 浏览
提问于 2025-04-17 23:57

我正在制作各种搜索选项,以便在打印报告之前进行筛选。比如说,如果用户提供一个日期时间,系统就只会打印在这个日期时间范围内的记录。但是如果用户没有提供日期,搜索就会跳过这个参数,按照其他选择的选项进行筛选,等等。

这个搜索是通过一个向导触发的,用户在这里输入搜索选项,然后按下打印按钮。我找不到一个合适的方法来实现条件搜索,因为我不知道用户是否输入了某些条件或者留空。因此,我想出了一个解决办法,如下所示:

    card_id = datas['form']['card_id'][0]        
    if card_id:
        start_filter = (1, '=', 1)
        end_filter = (1, '=', 1)
        if datas['form']['start_date']: 
            start_date = datas['form']['start_date']                
            start_filter = ('date', '>=', start_date)
        if datas['form']['end_date']:
            end_date = datas['form']['end_date']
            end_filter = ('date', '<', end_date)

        message_ids = self.pool.get('mail.message').search(self.cr, self.uid, 
        [('res_id', '=', card_id), ('model','=', 'some.model'),
        start_filter, end_filter], order='write_date') 

基本上,这段代码使用了1 = 1作为默认的筛选条件,这样如果用户没有选择这个条件,系统就会找到所有记录,因为1 = 1永远为真。如果用户选择了这个条件,那么在搜索之前,if条件会被触发,并用正确的条件覆盖默认的筛选条件。

不过我觉得这种方法并不是很优雅,因为我需要使用很多if条件,并且为每个条件提前设置默认的筛选条件。我想应该有更优雅、更好的方法吧?

1 个回答

0

你不需要把默认值设置成(1, '=', 1)。如果你给搜索功能传一个空的搜索元组列表,它会在应用模型中定义的任何记录规则后,返回所有记录。

这种写法很常见,除了让你的代码结构更清晰之外,我不知道还有其他方法可以让它更简洁。你可以先从一个空的搜索元组列表开始,然后依次调用一些方法,生成每个搜索元组并添加到这个列表里。

撰写回答