我有一个经典的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中实现这一目标?
答案 0 :(得分:3)
我认为隐含地将您的观点正式化,即纬度和经度FloatField,将无法让您从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