Bỏ qua để đến Nội dung
Menu
Câu hỏi này đã bị gắn cờ
1 Trả lời
2445 Lượt xem

Buenos dias, tardes, noches, tengo un problema al intentar poner un campo de la tabla con la que se relacion el One2many. Tengo el siguiente código:


class Item(models.Model):
_name = "sst.item"

cycle_id = fields.Many2one('sst.cycle', string="Ciclo")
standard_id = fields.Many2one('sst.standard', string="Estándar")
substandard_id = fields.Many2one('sst.substandard', string="Subestándar")
literal = fields.Char(string="Literal")
weight = fields.Float(string="Peso")
description = fields.Text(string="Descripción")
legal_frame = fields.Text(string="Marco Legal")
criterion = fields.Text(string="Criterio")
verification = fields.Text(string="Verificación")

plan_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
do_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
verify_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')
act_evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles')

cycle_name = fields.Char(related='cycle_id.cycle', string="Ciclo")
standard_name = fields.Text(related='standard_id.description', string='Estándar')
substandard_name = fields.Text(related='substandard_id.description', string='SubEstándar')

def test(self):
# Buscar si ya existe una evaluación para este ítem y ciclo específico
evaluation = self.env['sst.item.evaluation'].search([
('item_id', '=', self.id),
('evaluation_id', '=', self.plan_evaluation_id.id)
# Filtrar por evaluación del año en curso
], limit=1)

if evaluation:
view_mode = 'form'
res_id = evaluation.id
else:
view_mode = 'form'
res_id = None # No se asigna ID para crear uno nuevo

return {
'type': 'ir.actions.act_window',
'name': 'Evaluación del Ítem',
'res_model': 'sst.item.evaluation',
'view_mode': view_mode,
'view_id': self.env.ref('sst.view_item_evaluation_form').id,
'target': 'new',
'res_id': res_id,
'context': {
'default_item_id': self.id,
'default_evaluation_id': self.plan_evaluation_id.id,
# Establecer el evaluation_id al actual
'default_item_weight': self.weight,
}
}


class ItemEvaluation(models.Model):
_name = "sst.item.evaluation"
_description = "Evaluación del Ítem"

item_id = fields.Many2one('sst.item', string="Ítem")
evaluation_id = fields.Many2one('sst.initial.evaluation.by.cycles', string="Evaluación por Ciclos")
date = fields.Date(string="Fecha", default=fields.Date.context_today)

compliance = fields.Selection(
selection=[],
string="Cumplimiento"
)

applies = fields.Selection([
('aplica', 'Aplica'),
('no_aplica', 'No Aplica')
], string="Aplica", default='aplica')

responsible = fields.Char(string="Responsable")
observation = fields.Text(string="Observación")

De acá lo importante es el modelo

sst.item.evaluation

El cual tiene un campo Many2One con sst.item, y sst.item tiene varios campos entre ellos weight

item_id = fields.Many2one('sst.item', string="Ítem")


Lo que yo deseo hacer es que en el compliance una de las opciones del selection sea el campo weight del modelo sst.item. Quiero hacer algo asi:


compliance = fields.Selection([
('weight', item_id.weight),
​], string="Cumplimiento"
)


Pero no he logrado conseguirlo. Me ayudarían mucho, gracias

Ảnh đại diện
Huỷ bỏ
Câu trả lời hay nhất

Hi,


Using a dynamic value like item_id.weight directly in the Selection field definition isn't possible, as the Selection options are static. However, you can add a related field to get the weight from the related sst.item:

related_item_weight = fields.Float(related='item_id.weight', string="Item Weight")


Keep the compliance field as a Selection field with static options:

compliance = fields.Selection([

    ('weight', 'Weight'),

    ('option1', 'Option 1'),

    ('option2', 'Option 2'),

], string="Cumplimiento")

Add more options as needed instead of option 1 and option 2.


Use a computed field to get the value according to the selected compliance:

compliance_value = fields.Float(string="Compliance Value", compute='_compute_compliance_value', store=True)


@api.depends('compliance', 'related_item_weight')

    def _compute_compliance_value(self):

        for record in self:

            if record.compliance == 'weight':

                record.compliance_value = record.related_item_weight

            else:

                record.compliance_value = 0.0  # or any other default


Also, update your views to include the compliance_value field.


Hope it helps

Ảnh đại diện
Huỷ bỏ
Bài viết liên quan Trả lời Lượt xem Hoạt động
2
thg 4 24
1699
1
thg 4 24
2279
2
thg 9 24
1626
2
thg 7 24
2256
0
thg 5 24
1000