Volle äußere Verbindung in Django

8

Wie kann ich eine Abfrage für einen vollständigen äußeren Join über einen M2M-Relationshipchip mit der django QuerySet-API erstellen?

Wenn dies nicht unterstützt wird, wäre ein Hinweis auf das Erstellen eines eigenen Managers willkommen.

Bearbeitet zum Hinzufügen: @ S.Lott: Danke für die Erleuchtung. Die Notwendigkeit für den OUTER JOIN kommt von der Anwendung. Es muss einen Bericht erstellen, der die eingegebenen Daten anzeigt, auch wenn sie noch unvollständig sind. Ich war mir nicht bewusst, dass das Ergebnis eine neue Klasse / ein neues Modell wäre. Deine Hinweise werden mir sehr helfen.

    
Ber 31.10.2008, 09:46
quelle

2 Antworten

11

Django unterstützt nicht "Joins" im üblichen SQL-Sinne - es unterstützt die Objektnavigation.

Beachten Sie, dass eine relationale Verknüpfung (innere oder äußere) eine neue "Klasse" von Entitäten erstellt. Eine, die in Django keine Definition hat. Es gibt also keine richtige "Ergebnismenge", da es keine Klassendefinition für die Dinge gibt, die du zurückbekommst. Das Beste, was Sie tun können, ist ein Tupel zu definieren, das mit None's für fehlende Kombinationen gepackt wird.

Ein linker (oder rechter) äußerer Join sieht so aus. Es erstellt zwei disjunkte Teilmengen, diejenigen, die eine zugehörige Gruppe von verbundenen Entitäten haben, und diejenigen, die keine verknüpften Entitäten haben.

%Vor%

Ein "vollständiger" äußerer Join ist eine Vereinigung der verbleibenden Elemente, die keine Beziehungen haben.

%Vor%

Das Problem ist immer, welche Verarbeitung machst du mit dieser seltsamen Sammlung von drei verschiedenen Teilmengen von Objekten?

Der Punkt einer Objektdatenbank besteht darin, die Verarbeitung auf das Objekt und seine zugeordneten Objekte zu konzentrieren.

Die eigenartige Sammlung, die als "relationaler Join" bezeichnet wird, befindet sich niemals im ursprünglichen Objektmodell. Es ist eine neue Klasse von Objekten, die aus zwei (oder mehr) Originalobjekten besteht.

Schlimmer noch: Outer-Joins erzeugen eine Sammlung mit mehreren Unterklassen (innere Verbindung, linke äußere Verbindung und rechte äußere Verbindung). Was bedeutet diese Sammlung von Dingen ?

Warte, es kann schlimmer werden. Wenn die Verarbeitung Prüfungen für die fehlenden Attribute enthält (zB if someObj.anObj2attribute is None : Wir suchen im Wesentlichen nach Model1 -Elementen ohne Model2 -Objekt. Ummm ... warum haben wir diese in die äußere Verknüpfung eingefügt, nur um sie zu filtern sie verwenden eine if -Anweisung? Warum nicht nur separate Abfragen und Verarbeitung jeder Teilmenge richtig?

Bearbeiten: Wenn Sie den Status "unvollständig" anzeigen, handelt es sich nicht um einen Outer-Join. Es ist viel einfacher. Sie müssen eine oder zwei separate Sammlungen in Ihrer Ansichtsfunktion erstellen, damit Ihre Vorlage angezeigt wird.

Zuerst sollten Sie Statuscodes verwenden, nicht das Vorhandensein oder Fehlen eines Fremdschlüssels. Optionale Fremdschlüssel haben keine "Gründe" - sie sind entweder da oder nicht da. Ein Statuscode kann nützliche Bedeutungsschattierungen liefern ("unvollständig", "fehlerhaft", "gebrochen", "nicht anwendbar", "zu löschen" usw.)

%Vor%

Diese beiden sind die beiden Nicht-Join-Teile eines vollständigen äußeren Joins. Sie können dann diese zwei Fehlerlisten in Ihrer Vorlage mit den entsprechenden Spaltenüberschriften und Statuscodes und allem anzeigen.

Sie können sie sogar in eine einzige Tabelle einfügen, um den alten vollständigen Outer-Join-Bericht zu reproduzieren, mit dem Leute

gesehen haben %Vor%

Sieht wie ein vollständiger Outer-Join-Bericht aus. Ohne den vollständigen äußeren Join.

    
S.Lott 31.10.2008, 10:23
quelle
1

Colin, einer der Jungs, mit denen ich arbeite, schrieb einen Post zurück über benutzerdefinierte Joins in Django:

Ссылка

Vielleicht finden Sie dort etwas Nützliches!

    
tobias.mcnulty 12.03.2010 01:14
quelle

Tags und Links