我有一个Place
模型,其中有一个多边形字段:
from django.contrib.gis.db import models
class Place(models.Model):
area = models.PolygonField()
我想翻译此area
模型实例的Place
字段。
这是我现在正在做的事情:
from django.contrib.gis.db.models.functions import Translate
place = Place.objects.get(pk=1)
place.area = Place.objects.filter(pk=place.pk).annotate(new_area=Translate('area', 0.001, 0.001)).first().new_area
place.save()
这似乎很hacky。我认为应该以以下方式实现此目的:
place = Place.objects.get(pk=1)
place.area = Translate(place.area, 0.001, 0.001)
place.save()
但这会引发异常。
我应该使用一些图书馆吗?哪一个适用于GeoDjango及其模型/字段?
有什么更好的方法?
答案 0 :(得分:0)
请注意django.contrib.gis.db.models.functions
中的“ db”。没有Python函数,这些是类(因此,名称中的首字母大写)允许您访问数据库系统的空间功能(通常由空间数据库扩展(例如SQLite的空间数据库或PostgreSQL的PostGIS)提供)。参见GeoDjango documentation
此页面上记录的功能允许用户访问要在Django中的注释,集合或过滤器中使用的地理数据库功能。
(强调我的。)
也就是说,这些只能在查询中使用,因为需要将空间计算工作卸载到数据库中。
那么您可以做什么,而不是执行几个查询?
update
查询如果直接在SQL中执行此操作,则可能会编写一个UPDATE
查询。 Django ORM允许您使用update()
method在Django中执行相同的操作。
它可能看起来像这样(未经测试):
Place.objects.filter(pk=1).update(area=Translate('area', 0.001, 0.001))
如果您仍在使用GeoDjango,这可能是首选方式。
如您所建议,您可以使用外部库代替GeoDjango的Translate
,例如shapely.affinity.translate
from the shapely
library。但是,我怀疑它会接受GeoDjango的django.contrib.gis.geos.GEOSGeometry
作为输入,因此您可能必须通过GeoJSON或WKT来回转换。
如果需要空间计算独立于基础数据库系统,请使用此方法。