1

我需要在我的活动方法中进行两项活动。一个是需要返回 total_workers 字段的值。但也需要返回 ID,因为当我们覆盖该方法时,它在 OpenERP 中是必需的。然后必须返回 2 件事。请告诉我如何在我的表单中实现这一点。有一个返回值,这对两件事都有效。但需要同时返回。

def create(self, cr, uid, values, context=None):
    name = 'CheckRoll No = ' + str(values['checkroll_no']) + ' & Gang No = ' + str(values['gang_no'])
    values.update({'name': name})
    total_tea_workers = 0
    offer_id = super(bpl_work_offer, self).create(cr, uid, values, context=context)
    tea_worker_obj = self.browse(cr, uid, offer_id, context=context) or []
    tea_worker_ids = self.pool.get('bpl.selected.tea.workers.line').search(cr, uid, [('tea_line_worker_id', '=', tea_worker_obj.id)])
    for tea_worker in self.pool.get('bpl.selected.tea.workers.line').browse(cr, uid, tea_worker_ids):
        if tea_worker.is_selected:
            total_tea_workers += 1
    return {'value': {'total_workers': total_tea_workers}}
    return offer_id

已编辑

我以这种方式整理出来。希望这对其他人有帮助:-)

我为我的领域写了一个函数

def _compute_workers(self, cr, uid, ids, fieldname, arg, context=None):
    total_workers = total_tea_workers = total_rubber_workers = total_sundry_workers = total_other_workers = 0
    res = dict.fromkeys(ids, False) 
    for this in self.browse(cr, uid, ids, context=context):
        tea_worker_ids = self.pool.get('bpl.selected.tea.workers.line').search(cr, uid, [('tea_line_worker_id', '=', this.id)])
        for tea_worker in self.pool.get('bpl.selected.tea.workers.line').browse(cr, uid, tea_worker_ids):
            if tea_worker.is_selected:
                total_tea_workers += 1                
        rubber_worker_ids = self.pool.get('bpl.selected.rubber.workers.line').search(cr, uid, [('rubber_line_worker_id', '=', this.id)])
        for rubber_worker in self.pool.get('bpl.selected.rubber.workers.line').browse(cr, uid, rubber_worker_ids):
            if rubber_worker.is_selected:
                total_rubber_workers += 1                
        sundry_worker_ids = self.pool.get('bpl.selected.sundry.workers.line').search(cr, uid, [('sundry_line_worker_id', '=', this.id)])
        for sundry_worker in self.pool.get('bpl.selected.sundry.workers.line').browse(cr, uid, sundry_worker_ids):
            if sundry_worker.is_selected:
                total_sundry_workers += 1                
        other_worker_ids = self.pool.get('bpl.selected.other.workers.line').search(cr, uid, [('other_line_worker_id', '=', this.id)])
        for other_worker in self.pool.get('bpl.selected.other.workers.line').browse(cr, uid, other_worker_ids):
            if other_worker.is_selected:
                total_other_workers += 1
    total_workers = total_tea_workers + total_rubber_workers + total_sundry_workers + total_other_workers                                                                             
    res[this.id] = total_workers 
    return res

我将整数字段更改为功能字段

'total_workers': fields.function(_compute_workers, type="integer", string="Total Workers"),

4

2 回答 2

3

create()除了创建的记录的 ID 之外,您不应该返回任何其他内容。通常这是通过super(myclass, self).create(...)确实将调用结果返回给父级来完成的。

目前尚不清楚您要使用total_workers代码实现什么目标。如果total_workers应该是计算字段,则根本不必覆盖create:只需将此列声明为 afields.function并将计算它的代码放入相应的函数中。

例如:

def _compute_workers(self, cr, uid, ids, fieldname, arg, context=None):
    result = dict.fromkeys(ids, False) # default result for each id
    for this in self.browse(cr, uid, ids, context=context):
        # let's assume you have a one2many called worker_ids
        result[this.id] = len(this.worker_ids)
    return result

_columns = {
    'total_workers': fields.function(_compute_workers, type="integer",
                                     string="Total Workers")
}

此时最好仔细阅读 OpenERP 技术备忘录OpenERP 框架文档,以了解 OpenERP API 及其应该如何使用 :-)

一旦您对模型的结构、各种字段类型、CRUD 方法和继承模式有了很好的了解,您应该能够快速浏览官方模块的源代码并找到您想要完成的任何示例。这应该会让你的生活更轻松!

于 2013-04-29T08:57:55.037 回答
1

我认为您以非常低效的方式计算工人数。您正在执行 SQL 过滤器以获取与 ID 匹配的每个工作人员,然后测试其中的单个标志。

我认为在您的选择语句中添加另一个标准会更有效率。

total_tea_workers = self.pool.get('bpl.selected.tea.workers.line').search(cr, uid, [('tea_line_worker_id', '=', id), ('is_selected', '=', True)]), count=True)
于 2014-07-12T07:19:56.257 回答