Ich werde „Abstand von einem Produkt zu einem Punkt“ zu sein, die 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 eine Prämie platziert hat angegeben, 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.
Store(coords,...) // store [store] is at [coords] and ...
Product(product,store,...) // product [product] is stocked by store [store] and ...
Seit Produkt hat Shop (s) als ManyToManyField es bereits eine „ProductStor“ Tabelle von Produkten und Lagerhäuser und Speicher ist bereits ein „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:
select p.product,distance
select p.product,distance(s.coord,[pnt]) as distance
from Store s join Product p
on s.store=p.store
group by product
having distance=min(distance)
order by distance
Es sollte dies einfach sein kartieren zu einem query. Allerdings bin ich mit Django nicht vertraut genug, um dir jetzt genauen Code zu geben.
from django.db.models import F
q = Product.objects.all()
.filter(store__product=F('product'))
...
.annotate(distance=Min('coord.distance([pnt])'))
...
.order_by('distance')
Die Min() ist ein Beispiel für aggregation.
Ihnen kann auch geholfen werden, indem Sie explizit eine subquery machen.
Es ist auch möglich, dies über die Schnittstelle raw 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.
Ich hatte diese Schwierigkeit auch. Vielleicht ist das mit GeoDjango nicht möglich? Vielleicht muss man dafür einen rohen sql erstellen? –
@JoeJ Ich poste, was ich als mögliche Antwort getan habe, aber ich mag es nicht. Wahrscheinlich kann das rohe SQL funktionieren, aber ich bin nicht sehr komfortabel mit räumlichen Abfragen und dem. Überprüfen Sie die Antwort und sehen Sie, was Sie denken. – manuel
Das Produkt hat ein 'ManyToMany' zum' Store', aber es ist das Geschäft, das 'PointField' hat. Ein Produkt kann in 1 oder mehr Geschäften sein ... ** Wich ist die Entfernung für ein Produkt, das mehr als 1 Geschäft hat? ** Das niedrigere? Der höhere ? Alle ? – AlvaroAV