queryset query objects cual consultas avanzadas django orm django-models

query - ¿Por qué el método `save` de django ORM no devuelve el objeto guardado?



django queryset to list (2)

En general, se considera una buena práctica en Python tener funciones que afectan principalmente a los objetos existentes que no se devuelven. Por ejemplo, sorted(yourlist) devuelve una lista ordenada pero yourlist.sort() ordena la lista in situ y no devuelve nada.

La realización de operaciones múltiples con efectos secundarios (en oposición a las funciones sin efectos secundarios donde el foco está en el valor de retorno) en una sola línea no es realmente una buena práctica. El código será más compacto en términos de número de líneas, pero será más difícil de leer debido a que se pueden enterrar importantes efectos secundarios en el medio de una cadena. Si desea utilizar el encadenamiento de métodos, utilice funciones sin efectos secundarios al principio de la cadena y luego tenga una única función con un efecto secundario como .save() al final.

Para decirlo de otra manera, en una cadena de métodos, el comienzo de la cadena es la entrada, el medio de la cadena transforma la entrada (navegando por un árbol, clasificando la entrada, cambiando la caja de una cadena, etc.) y el final del ciclo. cadena es la parte funcional que funciona con efectos secundarios. Si entierras métodos con efectos secundarios en el medio de la cadena, entonces no estará claro cuál es la cadena de tu método en realidad.

¿Alguna idea del razonamiento detrás de esta decisión de diseño? Me parece que tener obj.save() devuelve algo , solo tiene beneficios (como el método de encadenamiento) y no tiene inconvenientes.


Esto me recuerda el principio general que Greg Ward espoused en Pycon2015 recientemente, para no confundir las funciones con los procedimientos. Cada función debe devolver un valor o tener un efecto secundario, pero no ambos.

Básicamente, se hace la misma pregunta a dict.update ().