Agregar consultas personalizadas a los gerentes es la convención de Django. A partir de la documentación de Django en custom managers:
Adición de métodos adicionales Manager es la forma preferida para añadir funcionalidad "a nivel de tabla" a sus modelos.
Si se trata de su propia aplicación privada, la palabra de la convención no importa tanto; de hecho, la base de código interna de mi compañía tiene algunos métodos de clase que quizás pertenecen a un administrador personalizado.
Sin embargo, si está escribiendo una aplicación que va a compartir con otros usuarios de Django, entonces esperarán ver findBy
en un administrador personalizado.
No creo que los problemas de herencia que menciona sean demasiado malos. Si lees el custom managers and model inheritance docs, no creo que te pillen. El nivel de detalle de la escritura .objects
es soportable, al igual que es cuando hacemos consultas utilizando XYZ.objects.get()
y XYZ.objects.all()
He aquí algunas ventajas del uso de métodos de dirigentes en mi opinión:
La consistencia del API. Su método findBy
pertenece con get
, filter
, aggregate
y el resto. ¿Quiere saber qué búsquedas puede hacer en el administrador XYZ.objects
? Es simple cuando puedes introspectivamente con dir(XYZ.objects)
.
Los métodos estáticos "saturan" el espacio de nombres de la instancia. XYZ.findBy()
está bien, pero si define un método estático, también puede hacer xyz.findBy()
. Ejecutar la búsqueda findBy
en una instancia particular realmente no tiene sentido.
DRYness. A veces puede usar el mismo administrador en más de un modelo.
Habiendo dicho todo eso, depende de usted. No estoy al tanto de la razón por la cual no deberías usar un método estático.Usted es un adulto, que es su código, y si no desea escribir findBy
como método gerente, el cielo no va a caer en;)
Para la lectura adicional, recomiendo el blog Managers versus class methods por James Bennett, el gerente de lanzamiento de Django.
Gracias alasdir, su explicación tiene sentido y el enlace que ha agregado es muy útil. – Xerion