Sortierung nach Entfernung mit einem verwandten ManyToMany-Feld

8

Ich habe diese zwei Modelle.

%Vor%

Ich möchte die Produkte nach der Entfernung zu einem Punkt sortiert bekommen. Wenn das Speicherfeld in Product ein Fremdschlüssel wäre, würde ich dies tun und es funktioniert.

%Vor%

Da das Feld jedoch ein ManyToMany-Feld ist, bricht es mit

%Vor%

Ich habe das irgendwie erwartet, weil es nicht klar ist, welchen der Läden es benutzen sollte, um die Entfernung zu berechnen, aber gibt es irgendeinen Weg, dies zu tun.

Ich brauche die Liste der Produkte sortiert nach Entfernung zu einem bestimmten Punkt.

    
manuel 18.03.2013, 19:01
quelle

3 Antworten

1

Nur eine Idee, vielleicht würde das für Sie funktionieren, das sollte nur zwei Datenbankabfragen dauern (aufgrund der Funktionsweise von Prefetch). Urteile nicht hart, wenn es nicht funktioniert, ich habe es nicht versucht:

%Vor%

dann:

%Vor%     
Alexey Kuleshevich 18.06.2014 22:12
quelle
0

So habe ich es gelöst, aber ich mag diese Lösung nicht wirklich. Ich denke, ist sehr ineffizient. Es sollte einen besseren Weg mit GeoDjango geben. Also, bis ich eine bessere Lösung finden werde ich wahrscheinlich nicht verwenden. Hier ist was ich getan habe.

Ich habe dem Produktmodell eine neue Methode hinzugefügt

%Vor%

Dann kann ich diesen Weg sortieren

%Vor%

Irgendwelche besseren Lösungen oder Wege, dieses zu verbessern, sind sehr willkommen.

    
manuel 03.04.2013 11:02
quelle
0

Ich nehme "Entfernung von einem Produkt zu einem Punkt" als Mindestabstand von dem Punkt zu einem Geschäft mit diesem Produkt. Ich nehme die Ausgabe, um eine Liste von (Produkt, Entfernung) für alle Produkte zu sein, sortiert nach Entfernung aufsteigend. (Ein Kommentar von jemandem, der ein Kopfgeld platziert hat, gab an, dass sie manchmal auch wollen (Produkt, Entfernung, Geschäft) sortiert nach Entfernung, dann im Produkt speichern.)

Jedes Modell hat eine entsprechende Tabelle. Die Felder des Modells sind die Spalten der Tabelle. Jedes Modell / jede Tabelle sollte eine fill-in-the- (named-) Leerzeichen-Anweisung haben, deren Datensätze / Zeilen diejenigen sind, die eine wahre Aussage abgeben.

%Vor%

Da das Produkt Geschäfte wie viele zu vielen Feldern hat, ist es bereits eine "ProductStore" -Tabelle von Produkten und Lagerbeständen und Store ist bereits eine "StoreCoord" -Tabelle von Geschäften und deren Koordinaten.

Sie können die Felder eines beliebigen Objekts in einem Abfragefilter () für ein Modell mit einem manyToManyField angeben.

Die SQL dafür ist einfach:

%Vor%

Es sollte einfach sein, dies einer Abfrage zuzuordnen. Allerdings bin ich mit Django nicht vertraut genug, um dir jetzt einen genauen Code zu geben.

%Vor%

Das Min () ist ein Beispiel für Aggregation .

Ihnen kann auch geholfen werden, indem Sie explizit eine Unterabfrage erstellen.

Es ist auch möglich, dies über die rohe Schnittstelle abzufragen. Die obigen Namen sind jedoch nicht für eine Django-Rohabfrage geeignet. ZB sind die Tabellennamen standardmäßig APPL_store und APPL_product, wobei APPL der Name Ihrer Anwendung ist. Außerdem ist die Entfernung nicht Ihr PointField-Operator. Sie müssen die richtige Entfernungsfunktion angeben. Aber Sie sollten nicht auf der rohen Ebene abfragen müssen.

    
philipxy 25.06.2014 18:56
quelle

Tags und Links