Publicidad

miércoles, 8 de enero de 2014

Métodos ORM Básicos para Programar Modulos en Odoo (OpenERP)

Métodos ORM básicos (Crear, Buscar, Leer, Actualizar y Borrar)

Método create

Sintaxis

create (cr, uid, values, context=None)

Crea un nuevo registro con los valores especificados. Parámetros específicos:

values: Diccionario con los valores de los campos para el nuevo registro.

Devuelve el id del registro creado. Puede generar los siguientes errores:

AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si el usuario intenta
ignorar las reglas de acceso para crear el objeto solicitado.

ValidateError: Si el usuario intenta introducir un valor inválido para un campo que no está en la
selección.

UserError: Si se crease un bucle en una estructura de objetos jerárquica como resultado de la operación (como establecer un objeto como su propio padre).

Por ejemplo para crear un producto tendriamos que generar el diccionario con los valores necesarios, principalmente los que son requeridos por el Modelo:

product_obj = self.pool.get('product.product')

product_vals = {
                         'name': 'Producto X',
                         'type': 'product' ,
                         'list_price': 45.00,
                         'procure_method': 'make_to_stock',
                         }

product_create_id = product_obj.create(cr, uid, product_vals, context=None)

Método search

Sintaxis

search(cr, uid, args, offset=0, limit=None, order=None, context=None, count=False)

Busca registros basándose en el dominio de búsqueda. Parámetros específicos:

offset: Número de registros a omitir. Opcional. Por defecto 0.

limit: Número máximo de registros a devolver. Opcional. Por defecto None.

order: Columnas para establecer el criterio de ordenación. Opcional. Por defecto self._order=id.

count: Devuelve sólo el número de registros que coinciden con el criterio de búsqueda.

args: Lista de tuplas que especifican el dominio de búsqueda. Cada tupla de la lista del dominio de
búsqueda necesita 3 elementos en la forma ('field_name', 'operator', value), donde:

       •field_name: Debe ser un nombre válido del campo de un modelo de un objeto, posiblemente
siguiendo las relaciones many2one, usando la notación de punto. Por ejemplo partner_id.country es
un valor válido.
         •operator: Debe ser una cadena con un operador de comparación válido de esta lista: =, !=, >, >=, <,<=, like, ilike, in, not in, child_of, parent_left, parent_right. El significado de muchos de estos operadores es obvio. El operador child_of buscará registros que son hijos o descendientes de un registro dado, de acuerdo al significado de dicho modelo.

        •value: Debe ser un valor válido con que comparar los valores del campo field_name, dependiendo de su tipo.

El criterio del dominio puede ser una combinación que use 3 operadores lógicos que pueden añadirse entre tuplas:
        •'&': Y lógico. Por defecto.
        •'|': O lógico.
        •'!': No lógico o negación.

Estos son operadores prefijos (primero el operador y luego los operandos). El número de argumentos
necesarios para que los operadores "&" y "|" se puedan calcular es 2, mientras que el de la negación "!" es de sólo 1.

Para mostrar todos los registros, se debe pasar una lista vacía.

Devuelve una lista de ids (lista de números enteros) de los registros que coinciden con el criterio. 

Posibles errores:

AccessError: Si el usuario no tiene permisos de lectura en el objeto solicitado.

Por ejemplo buscar el producto Celular HTC:

product_obj = self.pool.get('product.product')

product_id = product_obj.search(cr, uid, [('name','=','Celular HTC'])

Método browse 

Sintaxis

browse (cr, uid, ids, context=None)

    Obtiene registros como objetos permitiendo utilizar la notación de puntos para explorar los campos y las relaciones.

    Devuelve un objeto (si ids es un entero) o lista de objetos (si ids es una lista de enteros) solicitados.
    Es un método muy potente, pues permite consultar con facilidad campos relacionados de forma encadenada a partir de un objeto. 

    Si por ejemplo obtenemos con el método browse la empresa con una cierta id, para consultar el nombre del país de la primera dirección postal de la empresa procederíamos así:

empresa = self.pool.get('res.partner').browse (cr, uid, ids, context)

nombre_pais = empresa.address_ids[0].country_id.name


Método read

Sintaxis

read (cr, uid, ids, fields=None, context=None)

Obtiene una lista de los valores de los campos fields de los registros ids. Tiene los siguientes parámetros:

•fields: Lista de campos.

Por ejemplo leer  precio de venta y codigo del producto Celular HTC:

product_obj = self.pool.get('product.product')
product_id = product_obj.search(cr, uid, [('name','=','Celular HTC'])
lista_campos = product_obj.read(cr, uid, [product_id], ['name','list_price','default_code'], context=None)

Esto me devuelve un diccionario con el nombre y valor de los campos solicitados algo como:

    {'list_price': 5500.00, 'default_code': 'CLHTC1'}


Método write

Sintaxis

write(cr, uid, ids, values, context=None)

Actualiza los registros con los ids dados con los valores de los campos dados. Parámetros específicos:

values: Diccionario con los valores de los campos a modificar. El tipo de los valores de campo que se pasan para los campos relacionales es específico.•En campos many2many se espera una lista de tuplas con el siguiente formato y significado:

(0, 0, { values })
(1, ID, { values })

Crea un nuevo registro con los valores dados en el diccionario y lo enlaza Actualiza los registros enlazados cuyo id es igual a ID (escribe los valores values en él)

Desvincula y borra los registros cuyos id coinciden con ID
(2, ID)

Corta el vínculo entre dos registros relacionados (elimina la relación entre los objetos pero no los objetos en si)
(3, ID)

Crea una relación con un registro existente cuyo id es igual a ID
(4, ID)

(5) Elimina todas las relaciones (como usar (3,ID) para todos los registros
   relacionados)

(6, 0, [IDs]) Reemplaza la lista de IDs vinculados (como usar (5) y (4,ID) para cada ID en  la lista de IDs

•En campos one2many se espera una lista de tuplas con el siguiente formato y significado:

(0, 0, { values }) Crea un nuevo registro con los valores dados en el diccionario y lo enlaza

(1, ID, { values }) Actualiza el registro vinculado cuyo id es ID (escribe los valores values en él)

(2, ID) Desvincula y borra el registro cuyo id es igual a ID

•En campos many2one usar simplemente la ID del registro de destino, que debe existir, o False para
borrar el enlace.

•Para campos de referencia, usar una cadena con el nombre del modelo, una coma, y el id del
objeto de destino.

Devuelve True.

Posibles errores:

AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si intenta soslayar las reglas de escritura del objeto solicitado.

ValidateError: Si el usuario intenta entrar un valor inválido en un campo que no está en la selección.

UserError: Si se crease un bucle en una estructura de objetos jerárquica como resultado de la operación (como es establecer un objeto como su propio padre).

Por ejemplo retomaremos el ejemplo anterior en el que utilizamos el metodo read para leer campos del modelo de Producto Celulat HTC y Actualizaremos el precio de Venta:

product_obj = self.pool.get('product.product')
product_id = product_obj.search(cr, uid, [('name','=','Celular HTC'])

product_obj.write(cr, uid, [product_id], {'list_price':6500.00}, context=None)


Método copy

Sintaxis.

copy (cr, uid, id, defaults=None, context=None)

Duplica el registro con el id propuesto actualizándolo con los valores por defecto. Parámetros:

defaults: Diccionario de valores de campo para cambiar antes de guardar el objeto duplicado.
Devuelve True.



Método unlink

Sintaxis

unlink(cr, uid, ids, context=None)

Borra los registros con los ids dados. Devuelve True. Posibles errores:

AccessError: Si el usuario no tiene permisos de escritura en el objeto solicitado, o si intenta soslayar las reglas de borrado del objeto solicitado.

UserError: Si el registro es una propiedad por defecto para otros registros.

Por ejemplo eliminaremos el Producto Celular HTC:

product_obj = self.pool.get('product.product')
product_id = product_obj.search(cr, uid, [('name','=','Celular HTC'])

product_obj.unlink(cr, uid, [product_id], context=None)


Espero sea de Ayuda para los Lectores del Blog...

Saludos y no se olviden Comentar...

8 comentarios:

  1. Hola amigo, muy buen blog, me aclaraste muchas dudas, quisiera hacerte una consulta, yo cree una clase de objetos 'services' que tiene una relacion one2many con 'sale.order', quiero poder leer el estado del presupuesto, y mostrarlo en 'services', sin embargo mi funcion me dicen que el tipo de dato (list) no se puede hashear

    ResponderEliminar
    Respuestas
    1. Que tal el problema que como es un campo one2many al modelo de Pedidos, tienes n estados uno por cada pedido de tu lista, tendrias que saber que "cotizacion" de la lista que tienes es en el que vas a obtener el estado y recorrerlos por ejemplo haciendo un browse a tu campo services digamos que tienes el campo
      "service_ids": fields.one2many("sale.order","service_id", "Lista de Pedidos"),

      Lo tienes que recorrer con un browse:
      for rec in self.browse(cr, uid, ids, context=None):
      for lines in rec.service_ids:
      print "### ESTADO DEL PEDIDO", lines.state

      Con esto estoy mandando prints a consola con el estado de cada pedido, aqui solo tendrias que hacer lo que necesitas.

      Saludos

      Eliminar
    2. Excelente ejemplo el de German Ponce Dominguez! Muchas gracias!

      Eliminar
  2. Muy bueno, gran ayuda. Muy agradecido.

    ResponderEliminar
  3. Hola, hay aguna recomendación para seguir documentación oficial en Odoo? En sitio esta bastante pobre en cantidad de funciones ORM comparando con las que explican en este articulo: http://bit.ly/12nqAZF

    ResponderEliminar
  4. Gracias amigo, me has ayudado mucho.

    ResponderEliminar
  5. Es un placer ayudar a todos, gracias a ustedes el Blog ah ganado mucha importancia en la Comunidad.

    Saludos.

    ResponderEliminar