GeoDjango模型的最佳实践

GeoDjango模型的最佳实践,django,geodjango,Django,Geodjango,我有一个经典的詹戈模型 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()

我有一个经典的詹戈模型

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()
然而,使用起来似乎相当笨拙

>>> foo = somevessel.location_set.create(point=Point(5, 23))
>>> foo.point.x
5.0
我仍然希望将位置存储为一个点,但更希望使用更本地的代码与模型交互,比如

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

这是否违反了最佳实践?在Django有没有一个简单的方法来实现这一点?

我认为,像这样含蓄地形式化你的观点,即用纬度和经度s,不会让你从中充分受益。如果不是一个“坏习惯”,这很可能是一个没有起点

我仍然希望将位置存储为一个点,但更希望与具有更多本地代码的模型交互

为了以更自然的方式与模型交互,我将在我的模型类中定义属性,这些属性实际上将返回纬度和/或经度,这样做

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
允许你做

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