2015-05-18 7 views
10

Ich arbeite in Django 1.8. Ich möchte das LayerMapping import utility verwenden, um ein vorhandenes Modell zu aktualisieren.Django: Verwenden Sie LayerMapping, um ein vorhandenes Modell zu aktualisieren?

Dies ist meine Modelle Datei:

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() 

Ich habe bereits eine Reihe im Modell haben mit code: 03V und name: Corby und keine Grenze.

Jetzt möchte ich einige Grenzen für diese Zeile aus einer KML-Datei importieren. Das ist mein Importbefehl:

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) 

Das Problem, das ich habe, ist, dass dies die vorhandene Zeile zu wischen scheint, und ein neues ohne name Feld erstellen. Gibt es eine Möglichkeit, die Zeile mithilfe von LayerMapping zu aktualisieren, anstatt sie zu überschreiben?

Hier ist eine Probe des KML, falls dies für die Prüfung hilft:

<?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> 

Wenn ich nicht LayerMapping verwenden, können Sie bitte erklären könnte, wie die Grenze aus der KML-Datei zu importieren, ohne LayerMapping mit ?

+0

Ist die vorhandene Zeile neu erhalten, ohne 'ons_code' sowie' name'? – OYRM

Antwort

3

Versuchen Sie, unique Argument hinzuzufügen. Mit Blick auf die LayerMapping Quellcode, der ein Update tun sollten, wenn Modell bereits vorhanden ist, aber ich habe es nicht getestet, so lassen Sie mich wissen, ob es funktioniert:

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

EDIT

Aber dafür aktualisiere das Feld es notwendig ist, LayerMapping.save Methode zu überschreiben. Leider ist es nicht möglich, es sehr TROCKEN zu machen. Erweitern LayerMapping und kopieren Sie den gesamten Code aus Original speichern und ersetzen Linien 561 - 565 wie so:

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) 
     ... 
+0

Danke für die Antwort und Entschuldigung für die verzögerte Antwort. Leider erzeugt dies jetzt den folgenden Fehler: 'Datei" /Users/me/.virtualenvs/project/lib/python2.7/site-packages/django/contrib/gis/utils/layermapping.py ", Zeile 564, in _save geom .add (g) AttributeError: 'Polygon' Objekt hat kein Attribut 'add'' – Richard

+0

@Richard, ich kann sehen, was das Problem ist, wenn es versucht, neue Geometrie zu einer Sammlung von Geometrien hinzuzufügen, die es annimmt, ist bereits angefügt auf das Feld. Es scheint mir wie ein Bug oder ein schlecht entworfenes Feature zu sein. Die einzige Möglichkeit, um das zu erreichen, was Sie versuchen, ist die 'LayerMapping.save' Methode. Ich füge es der Antwort hinzu. –

Verwandte Themen