【问题标题】:Best practices for GeoDjango ModelsGeoDjango 模型的最佳实践
【发布时间】:2017-12-16 02:51:36
【问题描述】:

我有一个经典的 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】:

    我认为像这样隐含地形式化你的观点,即用纬度和经度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
    

    【讨论】:

      猜你喜欢
      • 2015-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-27
      • 1970-01-01
      相关资源
      最近更新 更多