django-unjoinify

Een helper voor het efficiënt ophalen van diep geneste gegevenssets
Download nu

django-unjoinify Rangschikking & Samenvatting

Advertentie

  • Rating:
  • Vergunning:
  • BSD License
  • Naam uitgever:
  • Matt Westcott
  • Uitgever website:
  • https://github.com/gasman/

django-unjoinify Tags


django-unjoinify Beschrijving

Een helper voor het efficiënt ophalen van diep geneste gegevenssets Django-Unjoinify is een Django-app voor het efficiënt ophalen van diepe geneste gegevenssets (voor mensen die niet bang zijn voor een beetje SQL). De problemen die u een website over filmfestivals hebt. Elk festival heeft veel prijzen en elke prijs heeft veel nominaties. Een nominatie behoort tot een film en een film kan verschillende bestuurders hebben (in een veel-tot-vele relatie). U wilt een pagina met de volledige selectie van genomineerde films op een festival, inclusief hun bestuurders. Als u dit de naïeve manier doet (looping over prijzen, dan nominaties / films, dan bestuurders), maakt u partijen en Veel kleine vragen. Deze Isbad.Select_Related helpt u hier niet - het kan geen enkele op-vele andmany-to-veel relaties volgen. (Zie Django-tickets # 2238 en # 6432.) Het traditionele antwoord is om de kogel te bijten en naar RAW SQL te laten vallen op dit punt: Selecteer Tinseltown_award.name, tinseltown_award.name, tinseltown_nomination.id als nominatie__id, tinseltown_nomination.ranking als nominatie__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 ON (= tinseltown_award.id tinseltown_nomination.award_id) LEFT JOIN tinseltown_movie ON (tinseltown_nomination.movie_id = tineltown_movie.id) Left Left Join TinSeltown_Movie_Directoren op (tinseltown_movie.id = tinseltown_movie_directors.movie_id) Left Word lid van TinSeltown_Person op (tinseltown_movie_directors.person_id = tinseltown_person.id) waar tineltown_award.festival_id =? Bestellen tineltown_award.name, tineltown_nomination.RankingThis vangt alle gegevens die u nodig hebt voor de pagina in een enkele query, maar er is een nadeel: alles wat u terugkrijgt, is een gewone SQL-resultaattabel, zonder toegang tot uw modelobjecten en hun liefdevol-gemaakte werkwijzen (Think Get_absolute_url) .Unjoinify to the RescueProvided Je hebt de Dubbele-underscore-notatie hierboven gebruikt voor je kolomnamen en zorgde ervoor dat ze overeenkomen met je relatienamen, Unjoinify zal je zoekopdracht aannemen, en door middel van een aantal Cunning Orm Introspection, reconstrueer een object Tree: Awards = Unjoinify (Award, "Selecteer TinSeltown_award.id ...", (Festival_id,)) (Prijs is de basisklasse die alle joins hangen en Festival_id is een parameter op de query.) Nou. .. bijna. Vanwege beperkingen van de ORM van Django kunnen we niet een juiste objectboom retourneren met de mogelijkheid om te verwijzen naar Award.Nominations enzovoort. In plaats daarvan, wat je terugkrijgt, is een reeks van (Award, Nominations) Tuples, waar Nominations zelf een scala aan (nominatie, film, bestuurders) tuples is, en Directors is een reeks persoonsobjecten. Dit is goed genoeg voor het doormaken van een sjabloon, hoewel: {% voor Award, Nominations in Awards%}

{{award.name}}

{% voor nominatie, film, directeuren in nominaties%}
  • {{nomination.ranking}}: {{film.title}} - {% voor directeur in directeuren%} {{director.first_name} } {{directeur.name}} {% Endfor%}
  • {% Endfor%}
      {% Endfor%} Unjoinify zal zelfs met Cartesiaanse join gebruiken - bijvoorbeeld als een film ook meerdere studio's had Meerdere bestuurders, u kunt deelnemen aan beide relaties en deze met succes uitpakken naar een tuple van (nominatie, film, bestuurders, studio's). U wordt geadviseerd om dit spaarzaam te gebruiken, maar dit zal resulteren in tellen (bestuurders) * Count (studio's) rijen die voor elke film worden geretourneerd, die, afhankelijk van uw bijzondere gebruiksbehuizing, zou kunnen eindigen Query's ... Expliciete kolomnamenUnfely, database-motoren kunnen een redelijk lage limiet hebben op de lengte van de kolomnaam (63 tekens, in het geval van PostGres), en het is gemakkelijk om deze limiet in te voeren bij het werken met diep geneste relaties. Om hier om te werken, kunt u de lijst met kolomnamen doorgeven als een extra parameter (in dezelfde volgorde die ze in de query verschijnen): Awards = Unjoinify (Award, SQL, (FESTIAL_ID,), Columns = ) Vereisten: · Python · Django


      django-unjoinify Gerelateerde software

  • django-cte-bomen

    Experimentele implementatie van bomen voor Django met behulp van PostgreSQL Gemeenschappelijke tafeluitdrukkingen (CTE) ...

    223

    Downloaden