logo del blog

Devproplus

Método sorted en Odoo

4 min de lectura

Odoo nos ofrece el método sorted() para poder ordenar los registros y presentarlos al usuario de manera rápida y eficiente, ya sea mediante una función personalizada, el nombre de un campo o el orden establecido en el atributo _order establecido en el modelo. En este artículo, exploraremos en detalle el funcionamiento del método sorted() en Odoo, desglosando sus parámetros con ejemplos prácticos para comprender cómo puede poner en orden la información de manera personalizada.

Como su nombre lo indica, el método "sorted" ordena los registros (records) dentro de un conjunto de registros según los valores que pasemos a sus parámetros. Los parámetros de sorted son key y reverse, por defecto key tiene como valor None y reverse es un booleano que tiene como valor por defecto False. Sin más dilación, veamos la sintaxis.

Sintaxis:

Model.sorted(key=None, reverse=False)

Parámetros:

key: Este parámetro puede recibir como argumento un callable(objeto que se puede llamar como función), un str o None.

reverse: Es un booleano que como se mencionó anteriormente, por defecto está en False, lo que indica que se devolverán los registros según lo establecido en key, si se establece en True, el resultado de sorted estará en un orden inverso.

Los ejemplos se basarán en un modelo llamado 'notebook.notebook' con un total de 9 registros. A continuación una imagen de los registros en en la interfaz de usuario de Odoo para tener un mejor contexto de los ejemplos que se verán.

Vista de tipo tree de los registos a los que se le aplicará el método sorted

Método sorted sin parámetros

En el siguiente ejemplo se utiliza 'sorted' sin pasarle argumentos, por lo que los parámetros tomarán los valores por defecto (key=None y reverse=False). En este caso los registros se ordenan según el orden predeterminado del modelo.

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted()
    print(records, "Resultado de usar 'sorted' sin argumentos")
    for rec in records:
        print(rec.brand, "-->", rec.id, "-->", rec.price)

Lo siguiente es el resultado.

notebook.notebook(1, 2, 3, 4, 5, 6, 7, 8, 9) Resultado de usar 'sorted' sin argumentos
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

Como se puede ver, primeramente utilizamos el método search para obtener los registros y sobre ese conjunto de registros se aplica 'sorted' y da como resultado el orden por defecto, ya que el valor de los parámetros que tiene son los de por defecto.

Método sorted con parámetro reverse = True

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted(reverse=True)
    print(records, "Resultado de usar 'sorted' con reverse = True")
    for rec in records:
        print(rec.brand, "-->", rec.id)
notebook.notebook(9, 8, 7, 6, 5, 4, 3, 2, 1) Resultado de usar 'sorted' con reverse = True
Acer --> 9
Lenovo --> 8
HP --> 7
Dell --> 6
Fujitsu --> 5
Dell --> 4
Toshiba --> 3
HP --> 2
Dell --> 1

Como se puede observar, el resultados se obtiene en el orden inverso al ejemplo anterior a este.

Método sorted con parámetro key = campo del modelo

Además de su valor por defecto, al parámetro key se le puede pasar el nombre de un campo perteneciente al modelo para que ordene según el campo.

Ejemplo del parámetro key = campo del modelo.

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted(key='price')
    print(records, "Resultado de usar 'sorted' con key = 'price'")
    for rec in records:
        print(rec.brand, "-->", rec.id, "-->", rec.price)
notebook.notebook(3, 5, 4, 8, 6, 1, 7, 9, 2) Resultado de usar 'sorted' con key = 'price'
Toshiba --> 3 --> 125.0
Fujitsu --> 5 --> 180.0
Dell --> 4 --> 290.0
Lenovo --> 8 --> 350.0
Dell --> 6 --> 450.0
Dell --> 1 --> 500.0
HP --> 7 --> 600.0
Acer --> 9 --> 700.0
HP --> 2 --> 1000.0

¿Qué pasa si le pasamos reverse=True al método del ejemplo anterior?

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted(key='price', reverse=True)
    print(records, "Resultado de usar 'sorted' con key = 'price' y reverse = True")
    for rec in records:
        print(rec.brand, ";-->", rec.id, "-->", rec.price)
notebook.notebook(2, 9, 7, 1, 6, 8, 4, 5, 3) Resultado de usar 'sorted' con key = 'price' y reverse = True
HP --> 2 --> 1000.0
Acer --> 9 --> 700.0
HP --> 7 --> 600.0
Dell --> 1 --> 500.0
Dell --> 6 --> 450.0
Lenovo --> 8 --> 350.0
Dell --> 4 --> 290.0
Fujitsu --> 5 --> 180.0
Toshiba --> 3 --> 125.0

Como se puede observar en los ejemplos anteriores le pedimos que ordene por el campo price, cuyo campo pertenece al modelo y la diferencia entre un ejemplo y otro está dada por el valor de reverse, ya que siempre ordena por precio, pero dependiendo del valor de reverse ordena de modo ascendente o descendente.

Método sorted con parámetro key = función

También al parámetro key se le puede pasar una función, esto permite más flexibilidad y personalización para el orden que deseemos obtener los resultados.

Ejemplo del parámetro key = función.

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted(key=lambda s: s.brand)
    print(records, "Resultado de usar 'sorted' con key = función")
    for rec in records:
        print(rec.brand, "-->", rec.id)
notebook.notebook(9, 1, 4, 6, 5, 2, 7, 8, 3) Resultado de usar 'sorted' con key = función
Acer --> 9
Dell --> 1
Dell --> 4
Dell --> 6
Fujitsu --> 5
HP --> 2
HP --> 7
Lenovo --> 8
Toshiba --> 3

En el ejemplo anterior se utiliza una función lambda y se toma el campo brand para ordenar por el mismo. A continuación otro ejemplo de como se puede usar sorted con key

def sorted_method_example(self):
    records = self.env['notebook.notebook'].search([]).sorted(key=self.custom_sort_function)
    print(records, "Resultado de usar 'sorted' con key = función")
    for rec in records:
        print(rec.brand, "-->", rec.id, "-->", rec.availability, "-->", rec.price)

def custom_sort_function(self, record):
    return (record.availability, record.price)
notebook.notebook(5, 4, 8, 1, 7, 9, 3, 6, 2) Resultado de usar 'sorted' con key = función
Fujitsu --> 5 --> available --> 180.0
Dell --> 4 --> available --> 290.0
Lenovo --> 8 --> available --> 350.0
Dell --> 1 --> available --> 500.0
HP --> 7 --> available --> 600.0
Acer --> 9 --> available --> 700.0
Toshiba --> 3 --> not available --> 125.0
Dell --> 6 --> not available --> 450.0
HP --> 2 --> not available --> 1000.0

En el anterior ejemplo tenemos un método llamado custom_sort_function y se pasa como valor de key. El método custom_sort_function devuelve una tupla que compara por el campo 'availability' y si hay empate entre los registros, ordena por el campo 'price'.

Conclusión

En este artículo se explora el funcionamiento del método sorted() en Odoo, destacando su utilidad para ordenar registros de manera eficiente. Se presentan ejemplos prácticos que ilustran el uso del método, tanto sin parámetros (usando los valores por defecto), como con parámetros personalizados como reverse y key.