django-unjoinify.

Ein Helfer zum effizienten Abrufen von tief verschachtelten Datensätzen
Jetzt downloaden

django-unjoinify. Ranking & Zusammenfassung

Anzeige

  • Rating:
  • Lizenz:
  • BSD License
  • Name des Herausgebers:
  • Matt Westcott
  • Website des Verlags:
  • https://github.com/gasman/

django-unjoinify. Stichworte


django-unjoinify. Beschreibung

Ein Helfer zum effizienten Abrufen von tief verschachtelten Datensätzen Django-Unjoinify ist eine Django-App zum effizienten Abrufen von tiefen verschachtelten Datensätzen (für Personen, die keine Angst vor einem Bit von SQL haben). Die PROBLEATION haben Sie eine Website über Filmfestivals. Jedes Festival hat viele Auszeichnungen, und jeder Preis hat viele Nominierungen. Eine Nominierung gehört einem Film, und ein Film kann mehrere Direktoren (in einer Vieler-zu-Vieler-Beziehung) haben. Sie möchten über eine Seite auflisten, die den vollen Kotalispieler nominierter Filme auf einem Festival auflistet, einschließlich deren Direktoren. Wenn Sie dies den naiven Weg tun (Looping über Auszeichnungen, dann Nominierungen / Filme, dann Direktoren), werden Sie am Ende viel und viele kleine fragen. Dieses Isbad (Siehe Django-Tickets # 2238 und # 6432.) Die traditionelle Antwort ist, die Kugel zu beißen und zu diesem Zeitpunkt auf Rohe SQL zu integrieren: Select tinseltown_award.id, tinseltown_award.name, tineltown_nomination.ID als Nominierung__ID, tineltown_nomination.Ranking als Nominierung __ranking, tinseltown_movie.id nomination__movie__id AS, AS tinseltown_movie.title nomination__movie__title, tinseltown_person.id nomination__movie__directors__id AS, AS tinseltown_person.first_name 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 = tinseltown_movie.id) link wechselnde tinseltown_movie_directors auf (tinseltown_movie.id = tinseltown_movie_directors.movie_id) link wechseln tineltown_person auf (tinseltown_movie_person.de) wo tineltown_award.festival_id =? Bestellen von tinseltown_award.name, tinseltown_nomination.RankingDie erfasst alle Daten, die Sie für die Seite in einer einzigen Abfrage benötigen, aber es gibt einen Nachteil: Alles, was Sie zurückkommen, ist eine einfache SQL-Ergebnistabelle, ohne Zugriff auf Ihre Modellobjekte und ihre liebevoll gefertigten Methoden (Think_Absolute_URL) .unjoinifizieren Sie sich mit dem RESCueProvided, den Sie die doppelte Unterstrich-Notation oben für Ihre Spaltennamen verwendet haben, und haben sie mit Ihren Relationsnamen übereinstimmen. Unjoinify trifft Ihre Anfrage, und rekonstruieren Sie durch ein paar listige ORM-Intrasparts ein Objekt Tree: Awards = Unjoinify (Award, "Select tinseltown_award.id ...", (Festival_ID,)) (hier ist die Basisklasse, die alle Joins abhängen, und FESTIVAL_ID ist ein Parameter für die Abfrage.) Nun. .. fast. Aufgrund von Einschränkungen von Django's Orm können wir keinen richtigen Objektbaum mit der Möglichkeit zurückgeben, auf Preisträger zu verweisen, und so weiter. Was Sie zurückkommen, ist ein Array von (Award, Nominierungen) Tupel, in denen Nominierungen selbst ein Array von (Nomination, Film, Directors) Tupeln ist, und Direktoren sind ein Array von Person-Objekten. Dies ist gut genug, um in einer Vorlage durchzuführen, obwohl: {% für Award, Nominierungen in Auszeichnungen%}

{{preisname}}

{% für Nominierung, Film, Direktoren in Nominierungen%}
  • {{nomination.ranking}}: {{movie.title}} - {% für Director in Directors%} {{Regisseur.First_Name} } {{Regisseur.surname}} {{% endfor%}
  • {% endfor%}
      {% endfor%} Unjoinify wird sogar kartesische Joins umgehen - zum Beispiel, wenn ein Film mehrere Studios als auch mehrere Studios hatte Multiple Directors, Sie könnten an beiden Beziehungen teilnehmen und sie erfolgreich auf ein Tupel von (Nominierung, Film, Direktoren, Studios) auspacken. Sie werden empfohlen, dies sparsam zu verwenden - dies wird dazu führen, dass Zählungen (Directors) * COUNT (Studios) -Zeilen (Studios) (Studios), die für jeden Film zurückgegeben werden, führen, der abhängig von Ihrem speziellen Anwendungsfall weitaus schlechter sein kann als getrennt zu sein Fragen Um dies zu umgehen, können Sie die Liste der Spaltennamen als zusätzlicher Parameter (in derselben Reihenfolge, die sie in der Abfrage erscheinen, weitergeben.: Awards = Unjoinify (Award, SQL, (Festival_ID,), Spalten = Anforderungen: · Python · Django


      django-unjoinify. Zugehörige Software