2012-01-26 16 views
8

Esta es una pregunta un tanto extraña, lo sé, pero tengan paciencia conmigo. Desarrollamos una plataforma RESTful utilizando Python para una de nuestras aplicaciones de iPhone. La versión de aplicación web se ha creado con Django, que también hace uso de esta API. Pensamos que sería una gran idea usar las funciones integradas del panel de control de Django para ayudar a administrar los datos.Django Admin utilizando RESTful API v.s. Base de datos

Esto en sí mismo no es el problema. El problema es que todo el mundo ha decidido que lo mejor del centro de administración era esencialmente un cliente que se encuentra en la parte superior de la plataforma REST.

Entonces, mi pregunta es, ¿hay alguna manera de manipular la capa de modelo de Django para acceder directamente a nuestra API, en lugar de comunicarlo directamente con la base de datos? La capa de modelo actuaría como cliente que pasa solicitudes y respuestas hacia y desde el centro de administración.

Estoy seguro de que esto es posible, pero no estoy seguro de dónde comenzaría. ¿Alguna entrada?

+1

nada es imposible, pero parece mucho trabajo. Si puede conectar django a la base de datos, se ahorrará mucho tiempo. Puedo entender el deseo de usarlo como una aplicación de prueba para la API, pero tal vez haya una aplicación diferente que pueda hacer, o incluso escribir casos de prueba. – monkut

+1

Parece que hay más trabajo del que valdría la pena. Probablemente tendrías que buscar administradores de modelo o un back-end de db personalizado. – jdi

+0

Wilhelm, estoy enfrentando la misma situación. ¿Alguna vez lo resolvió como pretendía o se dio por vencido y accedió directamente a la base de datos? – JoaoPSF

Respuesta

0

Recuerdo que una vez pensé en hacer tal cosa. En ese momento, creé un Administrador personalizado usando un QuerySet personalizado. Y eliminé algunos métodos como _filter_or_exclude(), count(), exists(), select_related(), ... y agregué algunas propiedades. Tomó menos de una semana convertirse en un desastre total que probablemente no tuvo oportunidad de funcionar algún día. Así que inmediatamente detuve todo y encontré una solución más adecuada.

Si tuviera que hacerlo una vez más, me tomaría mucho tiempo considerar alternativas. Y si realmente suena como lo mejor que se puede hacer, probablemente crearía un backend de base de datos personalizado. Este servidor, en lugar de convertir consultas ORM de Django a consultas SQL, las convierte a solicitudes HTTP. Para hacerlo, creo que el mejor punto de partida sería familiarizarse con django source code concerning database backends.

También creo que hay algunas cosas importantes a considerar antes de iniciar este desarrollo:

  • es la API capaz de manejar cualquier solicitud de ORM de Django? Dicho de otra manera: ¿se puede traducir una consulta ORM de Django a una solicitud API?
  • En caso negativo, ¿se pueden ignorar las consultas "intraducibles"? Por ejemplo, una cláusula ORDER BYpodría ser seguro de ignorar. Si bien una cláusula GROUP BY es muy improbable que se desestime de forma segura.
  • Si algunas consultas no se pueden traducir ni ignorar, pueden ser razonablemente emuladas. Por ejemplo, si su API no es compatible con una operación COUNT(), puede emularla obteniendo toda la información y contarla en python con len(), pero, ¿es esto razonable?
  • Si todavía hay algunas consultas que no podrá manejar (lo que es más que probable): ¿Están todas las consultas "comunes" (en este caso, todas las consultas potencialmente utilizadas por Django Admin) cubiertas y será ¿Es posible actualizar la API si se descubre un caso descubierto recientemente o se presenta en una versión futura de Django?

De acuerdo con el caso de uso, hay probablemente un montón de otras consideraciones a tener, tales como:

  • la integridad de los datos
  • apoyo de transacciones
  • el momento de una consulta que probablemente sea mucho más alto que solo consultar una base de datos local (o incluso remota).