django-desinimar

Un ayudante para recuperar de manera eficiente conjuntos de datos profundamente anidados
Descargar ahora

django-desinimar Clasificación y resumen

Anuncio publicitario

  • Rating:
  • Licencia:
  • BSD License
  • Nombre del editor:
  • Matt Westcott
  • Sitio web del editor:
  • https://github.com/gasman/

django-desinimar Etiquetas


django-desinimar Descripción

Un ayudante para recuperar de manera eficiente conjuntos de datos profundamente anidados Django-Unjeify es una aplicación de Django para recuperar de manera eficiente los conjuntos de datos profundamente anidados (para que las personas que no tienen miedo de un poco de SQL). Los problemasUponidos, usted tiene un sitio web sobre festivales de cine. Cada festival tiene muchos premios, y cada premio tiene muchas nominaciones. Una nominación pertenece a una película, y una película puede tener varios directores (en una relación de muchos a muchos). Desea tener una página que enumere la lista completa de películas nominadas en un festival, incluidos sus directores. Si lo hace lo ingenuo (bucle de los premios, luego las nominaciones / cine, luego los directores), terminará haciendo lotes y Muchas pequeñas consultas. Esta isbad.select_related no lo ayudará aquí, no puede seguir las relaciones entre sí y enmanjas a muchos. (Ver los boletos de Django # 2238 y # 6432). La respuesta tradicional es morder la bala y bajar a SQL RAW en este punto: seleccione Tinseltwnown_Award.ID, Tinseltwnown_Award.Name, Tinseltwnown_nomination.id como nominación__id, tinseltown_nomination.ranking como nominación. tinseltown_movie.id AS nomination__movie__id, tinseltown_movie.title AS nomination__movie__title, tinseltown_person.id AS nomination__movie__directors__id, tinseltown_person.first_name AS nomination__movie__directors__first_name tinseltown_person.surname AS nomination__movie__directors__surnameFROM tinseltown_award LEFT JOIN tinseltown_nomination ON (tinseltown_award.id = tinseltown_nomination.award_id) LEFT JOIN tinseltown_movie ON (tinseltown_nomination.movie_id = TINSELTWOWN_MOVIE.ID) ÚNETE TINSELLWN_MOVIE_DIRTORS ON (TINSELTWN_MOVIE.ID = TINSELLWN_MOVIE_DIRECTORS.MOVIE_ID) ÚNETE TINSELLWN_PERSON ON (TINSELTWN_MOVIE_DIRTORS.PERSON_ID = TINSELLWN_PERSON.ID) DONDE TINSELTWOWN_AWARD.FESTIVAL_ID tinseltwown_award.name, tinseltwown_nomination.rankingthis Captura todos los datos que necesita para la página en una sola consulta, pero hay un inconveniente: todo lo que vuelve es una tabla de resultados de SQL simple, sin acceso a sus objetos modelo y sus métodos con amor. (Piense en get_absolute_url) .unjuntary al rescateprendido Ha utilizado la notación de doble guión más arriba para los nombres de su columna y los hizo coincidir con los nombres de las relaciones, no se incorporarán su consulta, y a través de una introspección de ORM astutas, reconstruya un objeto Árbol: Premios = Desinicio (premio ", seleccione TINSELTWN_AWARD.ID ...", (Festival_ID,)) (aquí el premio es la clase base que todas las uniones están colgando, y Festival_ID es un parámetro de la consulta.) Bien. .. casi. Debido a las limitaciones del ORM de Django, no podemos devolver un árbol de objetos adecuado con la capacidad de referirse a los premios. Nominaciones, etc. En su lugar, lo que recibe es una variedad de tuplas (premios, nominaciones), donde las nominaciones son en sí misma una matriz de (nominación, cine, directores) tuplas, y directores es una serie de objetos de persona. Esto es lo suficientemente bueno para la iteración a través de una plantilla, sin embargo: {% para la adjudicación, nominaciones en premios%}

{{award.name}}

{% para la nominación, cine, directores de nominaciones%}
  • {{}} nomination.ranking: {{movie.title}} - {% para el director de directores%} {{} director.first_name {} {} {} director.surname% endfor%}
  • {% endfor%}
      {%}% endfor unjoinify incluso se encargará de cartesiano se une a - por ejemplo, si una película tenía múltiples estudios, así como varios directores, que podrían unirse en ambas relaciones y tienen que deshacer las maletas con éxito a una tupla de (nominación, película, directores, estudios). Le aconsejan utilizar con moderación, sin embargo - esto se traducirá en el recuento (directores) * La cuenta (estudios) filas que se devuelven para cada película, que, dependiendo de su uso-caso particular, pueden llegar a ser mucho peor que correr por separado consultas ... columna explícita namesUnfortunately, motores de bases de datos son susceptibles de tener un límite bastante bajo la longitud del nombre de columna (63 caracteres, en el caso de Postgres), y es fácil de ejecutar en este límite cuando se trabaja con las relaciones están anidadas. Para evitar esto, se puede pasar a la lista de nombres de columna como un parámetro adicional (en el mismo orden en que aparecen en la consulta): premios = unjoinify (Premio, sql, (festival_id,), columnas = ): · Python · Django


      django-desinimar Software relacionado

  • django-metaamage

    Envoltura alrededor de Django-Photologue Tratar con imágenes remotas y imágenes generadas por el servidor ...

    168

    Descargar