2016-05-22 8 views
8

Ich habe folgendes Modell:sortiert nach Breitengraden in geodjango

class Stop(models.Model): 
    name = models.CharField(max_length=50) 
    point = models.PointField() 
    objects = models.GeoManager() 

Ich mag meine Anschläge von Norden nach Süden sortieren. Wie mache ich das? sortiert sie von Westen nach Osten.

danke.

Das ist mein voller Modell:

from django.contrib.gis.db import models 
from django.core.urlresolvers import reverse 

class Stop(models.Model): 
    gtfs_stop_id = models.IntegerField(db_index=True, unique=True) 
    name = models.CharField(max_length=50) 
    point = models.PointField() 
    parkings = models.GeometryCollectionField(null=True, blank=True) 
    objects = models.GeoManager() 

    def get_absolute_url(self): 
     return reverse('core:stop', args=(self.id,)) 

    def __str__(self): 
     return self.name 
+0

Sie immer tun können, 'Stop.objects.order_by ('point__x')/Stop.objects.order_by ('- point__x')' oder \t 'Stop.objects.order_by ('point__y')/Stop .objects.order_by ('- point__y') ' – trinchet

+0

danke, aber das gibt einen Fehler: FieldError: Kann Schlüsselwort 'x' nicht in Feld auflösen. Join auf "Punkt" nicht erlaubt. – eran

Antwort

4

Da Ihr Punktfeld Geometrie und nicht die Geographie sind Sie im Glück.

from django.db.models import F, Func 
Stop.objects.annotate(lat=Func('point',function='ST_X')).order_by('lat') 

Ich verwende ST_X hier statt ST_Y weil PostGIS das Beste aus dem geodjango Datenbanken die Konvention lng,lat

Wenn Sie Ihr Punktfeld Geographie gewesen zu speichern ist der obige Funktionsaufruf wird nicht wegen gearbeitet hat ST_X und ST_Y sind nur für Geometriefelder verfügbar. Geography-Felder müssen in Geometry umgewandelt werden, bevor Sie diese Funktionen verwenden können.

+0

Ich bin mir nicht sicher warum, aber das gab mir einen Fehler. Ich habe am Ende extra dafür verwendet. Stop.objects.all(). Extra (wählen Sie = {'lat': 'ST_X (Punkt)'}). Order_by ('- lat') – eran

+0

Oh, tut mir leid, ich sehe es jetzt. Ich hatte in meiner Antwort "Ort" anstelle von "Punkt" verwendet. – e4c5

+0

Meine Antwort wurde aktualisiert. Bitte sehen Sie, ob es jetzt funktioniert, wenn Sie den Fehler nicht posten und versuchen, die Verwendung von extra zu vermeiden. – e4c5

0

Ich lief in den gleichen TypeError: Unsachgemäße Geometrie Eingabetyp: berichtet von eran, und ich war in der Tat mit einem PointField. Ich löste das Problem, indem ich einen ExpressionWrapper hinzufügte, um Django mitzuteilen, welche Art von Ausgabe zu erwarten ist (ein Float anstelle eines Punktes).

Auch in PostGIS, um den Breitengrad zu erhalten, sollten Sie ST_Y verwenden.

from django.db.models import FloatField, ExpressionWrapper, Func 
Stop.objects.all().annotate(lat=ExpressionWrapper(Func('point', function='ST_Y'), output_field=FloatField())).order_by('lat')