2017-12-16 3 views
1

Ich habe ein klassisches GeoDjango ModellBest Practices für die GeoDjango Modelle

from django.contrib.gis.db import models 

class Location(models.Model): 
    vessel = models.ForeignKey(Vessel, on_delete=models.CASCADE) 
    timestamp = models.DateTimeField(auto_now_add=True, blank=True) 
    point  = models.PointField() 

Allerdings Nutzung scheint ziemlich ungeschickt;

>>> foo = somevessel.location_set.create(point=Point(5, 23)) 
>>> foo.point.x 
5.0 

ich immer noch die Position als ein Punkt speichern wollen, aber würde mit dem Modell interagieren es vorziehen, mit mehr einheimischen suchen Code, so etwas wie

>>> foo = somevessel.location_set.create(latitude=5, longitude=12) 
>>> foo.latitude 
5.0 

Ist dies gegen Best Practices? Und gibt es einen einfachen Weg, dies in Django zu erreichen?

Antwort

2

Ich denke, dass implizit Formalisierung Ihres Punktes wie folgt, d. H. Mit Längen- und Breitengrad FloatField s, können Sie nicht vollständig profitieren von spatial lookup capabilities. Wenn es sich nicht um eine "schlechte Praxis" handelt, wird dies wahrscheinlich kein Starter sein.

ich die Position als ein Punkt noch speichern möchten, aber würde es vorziehen, mit dem Modell mit mehr nativen suchen Code zu interagieren,

mit dem Modell in einer nativen suchen Art und Weise zu interagieren, würde ich definieren Eigenschaften in meiner Modellklasse, die tatsächlich Breite und/oder Länge zurückkehren würde,

from django.contrib.gis.db import models 

class Location(models.Model): 
    vessel = models.ForeignKey(Vessel, on_delete=models.CASCADE) 
    timestamp = models.DateTimeField(auto_now_add=True, blank=True) 
    point  = models.PointField() 

    @property 
    def latitude(self): 
     return self.point.x 

    @property 
    def longitude(self): 
     return self.point.y 

tun erlauben Sie

>>> foo = somevessel.location_set.create(point=Point(5, 23)) 
>>> foo.latitude 
5.0 
0 zu tun