2015-05-18 5 views
10

मैं Django 1.8 में काम कर रहा हूं। मौजूदा मॉडल को अपडेट करने के लिए मैं LayerMapping import utility का उपयोग करना चाहता हूं।Django: मौजूदा मॉडल को अपडेट करने के लिए लेयरमैपिंग का उपयोग करें?

यह मेरा मॉडल फ़ाइल है:

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: 03V और name: Corby है, और कोई सीमा के साथ मॉडल में एक पंक्ति है।

अब मैं इस पंक्ति के लिए केएमएल फ़ाइल से कुछ सीमाएं आयात करना चाहता हूं। यह मेरा आयात आदेश है:

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 क्षेत्र के साथ एक नया बनाने के लिए लगता है। क्या लेयरमैपिंग का उपयोग करके पंक्ति को अद्यतन करने का कोई तरीका है, इसे ओवरराइट करने के बजाए?

यहाँ के एम एल का एक नमूना, मामले में इस परीक्षण के लिए मदद करता है है:

<?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 उपयोग नहीं कर सकते, तो कृपया आप KML फ़ाइल से सीमा आयात करने का तरीका समझा सकता है, LayerMapping का उपयोग किए बिना ?

+0

मौजूदा पंक्ति निर्मित हो करता ons_code' 'बिना रूप में अच्छी तरह के रूप में' name'? – OYRM

उत्तर

3

unique तर्क जोड़ने का प्रयास करें। करने के लिए

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

संपादित

लेकिन इसके लिए: LayerMapping स्रोत कोड है कि एक अद्यतन अगर मॉडल पहले से मौजूद है क्या करना चाहिए को देखते हुए, लेकिन मैं यह परीक्षण नहीं किया है, इसलिए मुझे पता है अगर यह काम करता है वास्तव में 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) 
     ... 
+0

देरी के जवाब देने के लिए उत्तर और क्षमा के लिए धन्यवाद। दुर्भाग्यवश यह अब निम्न त्रुटि उत्पन्न करता है: 'फ़ाइल "/Users/me/.virtualenvs/project/lib/python2.7/site-packages/django/contrib/gis/utils/layermapping.py", लाइन 564, _save geom में .add (g) विशेषताइंटर: 'पॉलीगॉन' ऑब्जेक्ट में कोई विशेषता नहीं है 'add'' – Richard

+0

@ रिचर्ड, मैं देख सकता हूं कि समस्या क्या है, जब इसे अद्यतन करते समय यह ज्यामिति के संग्रह में नई ज्यामिति जोड़ने की कोशिश करता है, तो यह मानता है कि यह पहले ही संलग्न है मैदान में। ऐसा लगता है कि मुझे बग, या खराब डिजाइन की सुविधा है। तो आप जो करने का प्रयास कर रहे हैं उसे हासिल करने का एकमात्र तरीका 'LayerMapping.save' विधि को कस्टमाइज़ करना है। मैं इसे उत्तर में जोड़ दूंगा। –

संबंधित मुद्दे