5 min de lectura Odoo nos proporciona el método search(), este método de búsqueda resalta como una herramienta fundamental para optimizar la experiencia del usuario y maximizar la eficacia del rendimiento del software. Mediante un enfoque versátil, el método search() ofrece a los desarrolladores la capacidad de recuperar los datos con precisión y agilidad, allanando el camino para presentar los datos de una forma más fluida. En este artículo exploraremos diferentes formas de utilizarlo y mi objetivo con dicho artículo es poder brindar una aproximación al método search(), ya que en la práctica existirán disímiles formas de utilizarlo, gracias a las necesidades de cada situación y la gran combinación que se puede hacer con los parámetros y operadores. Como su nombre lo indica, el método "search" busca y devuelve los registros (records) que coincidan o cumplan el criterio del dominio de búsqueda (search domain) que se le aplique como parámetro. Además de lo anterior, a search() se le puede aplicar otros parámetros para obtener una búsqueda más acotada a nuestras necesidades. Cabe destacar que los parámetros son opcionales, por eso se muestran en la sintaxis entre corchetes []. Por otro lado, en caso de que el usuario no tenga acceso a la información solicitada, search() devuelve un error de tipo AccessError. Veamos la sintaxis. Sintaxis: Parámetros: domain: Es el dominio de búsqueda o criterio a aplicar en la búsqueda, si se pasa una cadena vacía [], nos devuelve todos los registros si no aplicamos otros parámetros. En el caso de que apliquemos otros parámetros, nos devolverá registros acotados a eso parámetros. offset: Es un valor entero que se le aplica para ignorar la cantidad de resultados igual al valor de offset, por defecto es None. limit: Es el número máximo de registros a devolver por la búsqueda. por defecto devuelve todos los registros. order: Es un valor de tipo str(cadena o string) que se aplica para ordenar los registros devueltos. count: Este parámetro de tipo bool(booleano) sirve para contar la cantidad de registros que devuelve el método, por defecto es False. Las demostraciones se basarán en un modelo llamado 'notebook.notebook' con un total de 9 registros. A continuación 2 imágenes de los registros en la base de datos y en la interfaz de usuario de Odoo para tener un mejor contexto. En el siguiente ejemplo se utiliza search con una lista vacía[], lo que hace que nos devuelva todos los registros. Lo siguiente es el resultado. Como se puede observar obtuvimos todos los registros y se guardó en una variable. Luego se recorrió con un for la variable y se imprimió por consola todos los registros con algunos atributos para tener una mejor comprensión de lo que ocurre. En este caso se aplica un dominio de búsqueda por el atributo 'brand' y se usa el operador de comparación '=' para recuperar todas las notebooks que sean de la marca 'Dell'. Se puede aplicar más de un dominio de búsqueda. Vean el ejemplo. En este caso, al aplicar más de un dominio de la manera que se aplica en el ejemplo, implicitamente está presente el operador lógico '&' y por eso en el resultado solo obtenemos dos registros, ya que existen 3 notebooks de la marca Dell, peso solo dos tienen un precio menor a 500. Observen el siguiente ejemplo como puede cambiar el resultado con solamente agregar a la sintáxis anterior el operator '|' OR. Le estamos pidiendo de esta manera que nos devuelva las de la marca 'Dell' y también las que tengan el precio menor a 500. Veamos otro ejemplo un poco más complejo usando operadores. En el ejemplo pordrán ver el uso con 3 criterios de búsqueda(serach domain) y el uso de dos operadores lógicos '|'(OR). Se añadió también, el mismo uso de search, pero solo con un operador '|'(OR) para mostrar como cambia el resultado, poder comparar y así obtener un mejor entendiemiento de la utilización de search con operadores lógicos. El primer uso de search en el ejemplo anterior se puede traducir de la siguiente manera. Busca las notebooks con la marca 'Dell', también las que tiene un precio mayor o igual a 600 y también las que estén disponibles(available). Podemos observar que el único registro que no está es el 3, ya que este no cumple con ningún criterio. El segundo uso se puede leer como. Busca las notebooks de la marca 'Dell', también las que su precio sea igual o mayor a 600, pero de lo que encuentres con lo anterior, solo ten en cuenta las que estén disponibles. Por eso se puede observar que la Dell con el id 6, si bien cumple con la condición de ser marca Dell, no aparece porque no está disponible(available). Así con otra que si bien están disponibles no cumplen con ninguno de los dos primeros criterios aplicados. Como se puede observar con offset se ignoran los registros que le digamos. En este caso ignora dos registros. Como se muestra en los resultados, están ordenados descendentemente por el precio, gracias a la combinación del atributo a tener en cuenta para order(price) y la palabra reservada DESC. Por último un ejemplo un poco al azar para ver el uso de search con varios parámetros. Search es un método de Odoo que vamos a estar utilizando constantemente, es recomendable saber utilizarlo a fondo, ya que se puede tener muchas variaciones, gracias al uso de los operadores lógicos y de comparación. Dejo el link a la documentación oficial de la versión actual para que vean todos los operadores que se pueden usar en los dominios de búsqueda(search domain), en el momento de escribir este artículo por si quieren investigar un poco más.Model.search(domain[, offset=0][, limit=None][, order=None][, count=False])
Método search sin parámetros
def show_result_search(self):
records = self.env['notebook.notebook'].search([])
print(records, "Resultado de usar 'search' con lista vacía []")
for rec in records:
print(rec.brand, "--->", rec.id, "--->", rec.price)
notebook.notebook(1, 2, 3, 4, 5, 6, 7, 8, 9) Resultado de usar 'search' con lista vacía []
Dell ---> 1 ---> 500.0
HP ---> 2 ---> 1000.0
Toshiba ---> 3 ---> 125.0
Dell ---> 4 ---> 290.0
Fujitsu ---> 5 ---> 180.0
Dell ---> 6 ---> 450.0
HP ---> 7 ---> 600.0
Lenovo ---> 8 ---> 350.0
Acer ---> 9 ---> 700.0
Método search con domain(dominio)
def show_result_search(self):
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell')])
print(records, "Resultado de usar 'search' con domain")
for rec in records:
print(rec.brand, "--->", rec.id)
notebook.notebook(1, 4, 6) Resultado de usar 'search' con domain
Dell ---> 1
Dell ---> 4
Dell ---> 6
def show_result_search(self):
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell'), ('price', '<', 500)])
print(records, "Resultado de usar 'search' con domain")
for rec in records:
print(rec.brand, "--->", rec.id)
notebook.notebook(4, 6) Resultado de usar 'search' con domain
Dell --> 4 --> 290.0
Dell --> 6 --> 450.0
def show_result_search(self):
records = self.env['notebook.notebook'].search(['|', ('brand', '=', 'Dell'), ('price', '<', 500)])
print(records, "Resultado de usar 'search' con domain y el operador '|'")
for rec in records:
print(rec.brand, "-->", rec.id, "-->", rec.price)
notebook.notebook(1, 3, 4, 5, 6, 8) Resultado de usar 'search' con 'domain'(dominio) y operator '|' OR
Dell --> 1 --> 500.0
Toshiba --> 3 --> 125.0
Dell --> 4 --> 290.0
Fujitsu --> 5 --> 180.0
Dell --> 6 --> 450.0
Lenovo --> 8 --> 350.0
def show_result_search(self):
records_two_or = self.env['notebook.notebook'].search(
['|', '|', ('brand', '=', 'Dell'), ('price', '>=', 600), ('availability', '=', 'available')])
print(records_two_or, "Resultado de usar 'search' con 'domain'(dominio) y dos operator '|' OR")
for rec in records_two_or:
print(rec.brand, "->", rec.id, "->", rec.price, "->", rec.availability)
print("--------------------")
records_one_or = self.env['notebook.notebook'].search(
['|', ('brand', '=', 'Dell'), ('price', '>=', 600), ('availability', '=', 'available')])
print(records_one_or, "Resultado de usar 'search' con 'domain'(dominio) y un operator '|' OR")
for rec in records_one_or:
print(rec.brand, "->", rec.id, "->", rec.price, "->", rec.availability)
notebook.notebook(1, 2, 4, 5, 6, 7, 8, 9) Resultado de usar 'search' con 'domain'(dominio) y dos operator '|' OR
Dell -> 1 -> 500.0 -> available
HP -> 2 -> 1000.0 -> not available
Dell -> 4 -> 290.0 -> available
Fujitsu -> 5 -> 180.0 -> available
Dell -> 6 -> 450.0 -> not available
HP -> 7 -> 600.0 -> available
Lenovo -> 8 -> 350.0 -> available
Acer -> 9 -> 700.0 -> available
--------------------
notebook.notebook(1, 4, 7, 9) Resultado de usar 'search' con 'domain'(dominio) y un operator '|' OR
Dell -> 1 -> 500.0 -> available
Dell -> 4 -> 290.0 -> available
HP -> 7 -> 600.0 -> available
Acer -> 9 -> 700.0 -> available
Aplicando offset en search
def show_result_search(self):
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell')], offset=2)
print(records, "Resultado de usar 'search' con 'domain'(dominio) y offset")
for rec in records:
print(rec.brand, "-->", rec.id)
notebook.notebook(6,) Resultado de usar 'search' con 'domain'(dominio) y offset
Dell --> 6
Aplicando el parámetro limit en search
def show_result_search(self):
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell')], limit=1)
print(records, "Resultado de usar 'search' con 'domain'(dominio) y limit")
for rec in records:
print(rec.brand, "-->", rec.id)
notebook.notebook(1,) Resultado de usar 'search' con 'domain'(dominio) y limit
Dell --> 1
Utilizando el método search con el parámetro order
def show_result_search(self):
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell')], order='price DESC')
print(records, "Resultado de usar 'search' con 'domain'(dominio) y order")
for rec in records:
print(rec.brand, "-->", rec.id, "-->", rec.price)
notebook.notebook(1, 6, 4) Resultado de usar 'search' con 'domain'(dominio) y order
Dell --> 1 --> 500.0
Dell --> 6 --> 450.0
Dell --> 4 --> 290.0
Utilizando search con el parámetro count
def show_result_search(self):
all_records = self.env['notebook.notebook'].search([], count=True)
print(all_records, "Resultado de usar 'search' sin 'domain'(dominio) y count")
print()
records = self.env['notebook.notebook'].search([('brand', '=', 'Dell')], count=True)
print(records, "Resultado de usar 'search' con 'domain'(dominio) y count")
9 Resultado de usar 'search' sin 'domain'(dominio) y count
3 Resultado de usar 'search' con 'domain'(dominio) y count
Utilizando search con varios parámetros
def show_result_search(self):
records = self.env['notebook.notebook'].search(['|', ('brand', '=', 'Dell'), ('price', '>=', 600)], offset=1, limit=2, order='price DESC')
print(records, "Resultado de usar 'search' con 'domain'(dominio), operator '|' OR y varios parámetros")
for rec in records:
print(rec.brand, "->", rec.id, "->", rec.price)
notebook.notebook(6, 9) Resultado de usar 'search' con 'domain'(dominio), operator '|' OR y varios parámetros
Dell -> 6 -> 750.0
Acer -> 9 -> 700.0
Conclusión