2011-10-07 8 views
23

Después de leer sobre los administradores de Django, todavía no estoy seguro de cuánto beneficio obtendré al usarlo. Parece que el mejor uso es agregar métodos de consultas personalizadas (solo lectura) como XYZ.objects.findBy*(). Pero puedo hacerlo fácilmente con métodos estáticos fuera de las clases Model.Uso de administradores de Django vs. método estático en la clase de modelo directamente

prefiero este último siempre porque:

  1. código de localidad en términos de facilidad de lectura y un mantenimiento más fácil
  2. poco menos detallado que no necesito la propiedad objects en mis llamadas
  3. Manager clases tienen reglas extrañas con respecto a la herencia del modelo, bien podrían mantenerse al margen de eso.

¿Hay alguna buena razón no utilizar métodos estáticos y en su lugar utilizar clases de administrador?

Respuesta

28

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:

  1. 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).

  2. 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.

  3. 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.

+4

Gracias alasdir, su explicación tiene sentido y el enlace que ha agregado es muy útil. – Xerion

Cuestiones relacionadas