GeoDjango模型的最佳实践

问题描述 投票:2回答:1

我有一个经典的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()

然而,使用似乎非常笨拙;

>>> 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中实现这一目标?

django geodjango
1个回答
3
投票

我认为隐含地将你的观点正式化,即纬度和经度FloatFields,将不允许你完全受益于spatial lookup capabilities。如果不是“不良做法”,这很可能是一个不起作用的。

我仍然希望将位置存储为一个点,但更愿意使用更具原生代码的代码与模型进行交互,

为了以更原生的方式与模型交互,我将在我的模型类中定义实际返回纬度和/或经度的属性,

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
© www.soinside.com 2019 - 2024. All rights reserved.