es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Odoo Prevenir la Duplicación de Registros Seleccionados en un Campo One2many.

Quiero evitar que el registro seleccionado se muestre nuevamente en la lista desplegable.

Como puedes ver, el registro “710 – Maleo” se muestra nuevamente después de haberlo seleccionado anteriormente.

Declaración de campo para el campo “One2many”:

class RMReservationOrderLine(models.Model):
    _name = "rm.reservation.order.line"
    _description = "Reservation Order Line"

    room_line_ids = fields.One2many('rm.reservation.room.line', 'order_id', string='Rooms')

Clase del modelo para el campo “One2many”:

class RMReservationRoomLine(models.Model):
    _name = "rm.reservation.room.line"
    _description = "Reservation Room Line"

    order_id = fields.Many2one('rm.reservation.order.line', string='Order', required=True, ondelete='cascade')
    room_id = fields.Many2one('rm.room', string='Room', required=True)

ACTUALIZACIÓN

Dado que mi clase de modelo para el campo “One2many” solo tiene un campo, “room_id”, simplemente cambié el campo “One2many” a “Many2many” porque de forma predeterminada el campo “Many2many” evita registros duplicados.

Sin embargo, aún quiero saber cómo evitar registros duplicados si utilizo el campo “One2many”, en caso de que tenga más de 1 campo en la clase de modelo para “One2many”.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para evitar que un registro seleccionado aparezca nuevamente en la lista desplegable al usar un campo One2many, puedes establecer el atributo select del campo One2many en False. Esto ocultará los botones de buscar y seleccionar junto al campo y evitará que el usuario seleccione el mismo registro nuevamente.

    Sin embargo, si tienes más de un campo en la clase del modelo para el campo One2many y aún deseas evitar registros duplicados, puedes utilizar el decorador constraint en la clase del modelo para verificar duplicados antes de guardar el registro.

    Aquí tienes un ejemplo:

    from odoo import api, models, fields, _
    
    class RMReservationRoomLine(models.Model):
        _name = "rm.reservation.room.line"
        _description = "Línea de Habitación de Reserva"
    
        order_id = fields.Many2one('rm.reservation.order.line', string='Orden', required=True, ondelete='cascade')
        room_id = fields.Many2one('rm.room', string='Habitación', required=True)
    
        # Verificar registros duplicados
        @api.constrains('order_id', 'room_id')
        def check_duplicate_records(self):
            for record in self:
                if self.search([('id', '!=', record.id), ('order_id', '=', record.order_id.id), ('room_id', '=', record.room_id.id)]):
                    raise ValidationError(_('¡Registro duplicado encontrado!'))
    

    En este ejemplo, el método check_duplicate_records tiene el decorador api.constrains y verifica registros duplicados utilizando el método search. Si se encuentra un registro duplicado, se generará un error de validación y el registro no se guardará.

    Ten en cuenta que este enfoque agrega una carga de procesamiento adicional y puede afectar el rendimiento, especialmente si tienes un gran número de registros en el campo One2many. Por lo tanto, se recomienda utilizar el campo Many2many si no necesitas almacenar información adicional en la clase del modelo para el campo One2many.

Comments are closed.