gpt4 book ai didi

python - Django:使用 LayerMapping 更新现有模型?

转载 作者:太空狗 更新时间:2023-10-29 19:27:41 24 4
gpt4 key购买 nike

我在 Django 1.8 中工作。我想使用 LayerMapping import utility更新现有模型。

这是我的模型文件:

class PCT(models.Model):
code = models.CharField(max_length=3, primary_key=True,
help_text='Primary care trust code')
ons_code = models.CharField(max_length=9, null=True, blank=True)
name = models.CharField(max_length=200, null=True, blank=True)
boundary = models.GeometryField(null=True, blank=True)
objects = models.GeoManager()

我已经在模型中有一行 code: 03Vname: Corby,并且没有边界。

现在我想从 KML 文件中为该行导入一些边界。这是我的导入命令:

class Command(BaseCommand):
args = ''
help = 'Imports boundaries from KML.'

def handle(self, *args, **options):
filename = 'CCC_Feb2013.KML'
ds = DataSource(filename)
layer_mapping = {
'code': 'Name',
'boundary': 'Unknown'
}
lm = LayerMapping(PCT, filename, layer_mapping, transform=False)
lm.save(strict=True, progress=1, verbose=True)

我遇到的问题是,这似乎删除现有行,并创建一个没有 name 字段的新行。有没有什么方法可以使用 LayerMapping 更新行,而不是覆盖它?

这是 KML 示例,以防它有助于测试:

<?xml version="1.0" encoding="utf-8"?>
<kml xmlns="http://earth.google.com/kml/2.1">
<Folder>
<description><![CDATA[CCG boundary BSC]]></description>
<Placemark>
<name><![CDATA[03V]]></name>
<description><![CDATA[<br><br><br>
<table border="1" padding="0">
<tr><td>CCGcode</td><td>03V</td></tr>
<tr><td>CCGname</td><td>NHS Corby CCG</td></tr>
]]></description>
<visibility>1</visibility>
<open>0</open>
<Style><LineStyle><color>FF000000</color><width> 1</width></LineStyle>
<PolyStyle><fill>0</fill><outline>1</outline></PolyStyle></Style>
<Polygon>
<extrude>1</extrude>
<altitudeMode>clampToGround</altitudeMode>
<tessellate>1</tessellate>
<outerBoundaryIs><LinearRing>
<coordinates>
-.596387,52.496896,0
-.609296,52.508583,0...
</coordinates>
</LinearRing></outerBoundaryIs>
</Polygon>
</Placemark>
...
</Folder></kml>

如果我不能使用 LayerMapping,请您解释一下如何在不使用 LayerMapping 的情况下从 KML 文件导入边界?

最佳答案

尝试添加 unique 参数。查看 LayerMapping 源代码,如果模型已经存在,应该进行更新,但我还没有测试过,所以如果它有效,请告诉我:

lm = LayerMapping(PCT, filename, layer_mapping, transform=False, unique='code')

编辑

但要真正更新字段,必须覆盖 LayerMapping.save 方法。不幸的是,不可能让它变得非常干燥。扩展 LayerMapping 并复制原始保存和替换行中的所有代码 561 - 565像这样:

from django.contrib.gis.utils.layermapping import LayerMapping

class UpdateLayerMapping(LayerMapping):

def save(self, verbose=False, fid_range=False, step=False,
progress=False, silent=False, stream=sys.stdout, strict=False):

...

#geom = getattr(m, self.geom_field).ogr
#new = OGRGeometry(kwargs[self.geom_field])
#for g in new:
# geom.add(g)
#setattr(m, self.geom_field, geom.wkt)
for key, value in kwargs.iteritems():
setattr(m, key, value)
...

关于python - Django:使用 LayerMapping 更新现有模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30300876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com