django-unjoinify.

Um ajudante para recuperar eficientemente conjuntos de dados profundamente aninhados
Baixe Agora

django-unjoinify. Classificação e resumo

Propaganda

  • Rating:
  • Licença:
  • BSD License
  • Nome do editor:
  • Matt Westcott
  • Site do editor:
  • https://github.com/gasman/

django-unjoinify. Tag


django-unjoinify. Descrição

Um ajudante para recuperar eficientemente conjuntos de dados profundamente aninhados Django-UnJoinify é um aplicativo Django para recuperar eficientemente conjuntos de dados profundamente aninhados (para pessoas que não têm medo de um pouco de SQL). Os problemasupõem que você tem um site sobre festivais de cinema. Cada festival tem muitos prêmios, e cada prêmio tem muitas indicações. Uma nomeação pertence a um filme, e um filme pode ter vários diretores (em uma relação muitos-para-muitos). Você quer ter uma página listando a lista completa de filmes nomeados em um festival, incluindo seus diretores. Se você fizer isso a maneira ingênua (looping sobre prêmios, então indicações / filmes, depois diretores), você acabará fazendo lotes e Muitas pequenas dúvidas. Este isbad.select_Related não irá ajudá-lo aqui - não pode seguir as relações de uma e muitas e muitas e muitas. (Veja os bilhetes django # 2238 e # 6432.) A resposta tradicional é morder a bala e descer para o SQL bruto neste ponto: selecione tinseltown_award.id, tinseltown_award.id como nominação__id, tinseltown_nomination.ranking como nomeação__ranking, 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 EM (tinseltown_award.id = tinseltown_nomination.award_id) LEFT JOIN tinseltown_movie EM (tinseltown_nomination.movie_id = Tinseltown_movie.id) Left Juntar tinseltown_movie_directors on (tinseltown_movie.id = tinseltown_movie_directors.movie_id) Left Iniciar tinseltown_person on (tinseltown_movie_directors.person_id = tinseltown_person.id) onde tinseltown_award.festival_id =? ordem por tinseltown_award.name, tinseltown_nomination.rankingthis captura todos os dados necessários para a página em uma única consulta, mas há uma desvantagem: tudo que você recebe é uma tabela de resultados do SQL simples, sem acesso aos objetos do modelo e seus métodos amorosos (Think get_absolute_url) .unJoinificar para o resgateProvided você usou a notação de sublinhado duplo acima para seus nomes de coluna, e fez com que eles se encontrassem com seus nomes de relações, o UnJoinificy levará sua consulta e, através de alguma introspecção de Orm, reconstruirá um objeto. Árvore: Awards = UnJoinify (Prêmio, "Select Tinseltown_award.id ...", (Festival_id,)) (Aqui, é a classe base que todas as junções estão desligando e festival_id é um parâmetro para a consulta.) Bem. .. quase. Devido a limitações do ORM de Django, não podemos devolver uma árvore de objetos adequada com a capacidade de se referir a denominações e assim por diante. Em vez disso, o que você volta é uma matriz de (prêmio, nominações) tuplas, onde as indicações são em si uma matriz de tuplas (nomeação, diretores, diretores), e os diretores são uma matriz de objetos pessoais. Isso é bom o suficiente para iterar em um modelo, no entanto: {% de adjudicação, as indicações em prêmios%}

{{award.name}}

{% para nomeação, filme, diretores em nomeações%}
  • {{nomation.ranking}}: {{filme.title}} - {% para diretor de directores%} {{{{{}} } {{director.surname}} {% endFor%}
  • {% endFor%}
      {% endFor%} UnJoinificar vai mesmo lidar com a cartesiana junta - por exemplo, se um filme tinha vários estúdios, bem como Múltiplos diretores, você poderia participar de ambas as relações e fazer com que ele descompacte com sucesso a uma tupla de (nomeação, filme, diretores, estúdios). Você é aconselhado a usar isso com moderação, embora - isso resulte em contagem (diretores) * contagem (estúdios) linhas retornadas para cada filme, que, dependendo do seu caso de uso específico, pode acabar sendo muito pior do que correr Consultas ... Names de coluna explícitasunfortuntelyately, os motores de banco de dados são susceptíveis de ter um limite razoavelmente baixo no comprimento do nome da coluna (63 caracteres, no caso do Postgres), e é fácil de executar neste limite ao trabalhar com relações profundamente aninhadas. Para contornar isso, você pode passar a lista de nomes de colunas como um parâmetro adicional (na mesma ordem que aparecerá na consulta): Awards = UnJoinificar (Prêmio, SQL, (Festival_ID), Colunas = ) Requisitos: · Pitão · Django.


      django-unjoinify. Software Relacionado

  • django-metaimage

    wrapper em torno de django-photogoe lidando com imagens remotas e imagens geradas pelo lado do servidor ...

    168

    Download

    Django-Cte-Trees

    Implementação Experimental de árvores para Django usando Expressões de Tabela Comum PostgreSQL (CTE) ...

    223

    Download