2015-05-18 26 views
10

Tôi đang làm việc ở Django 1.8. Tôi muốn sử dụng LayerMapping import utility để cập nhật mô hình hiện tại.Django: Sử dụng LayerMapping để cập nhật mô hình hiện có?

Đây là mô hình tập tin của tôi:

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

Tôi đã có một hàng trong mô hình với code: 03Vname: Corby, và không có ranh giới.

Bây giờ tôi muốn nhập một số ranh giới cho hàng này từ tệp KML. Đây là lệnh nhập của tôi:

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) 

Vấn đề tôi đang gặp phải là điều này dường như xóa hàng hiện tại và tạo một hàng mới không có trường name. Có cách nào để cập nhật hàng bằng cách sử dụng LayerMapping, thay vì ghi đè nó?

Dưới đây là một mẫu của các KML, trong trường hợp này giúp cho kiểm tra:

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

Nếu tôi không thể sử dụng LayerMapping, xin vui lòng bạn có thể giải thích làm thế nào để nhập khẩu các ranh giới từ tệp KML, mà không sử dụng LayerMapping ?

+0

Liệu hàng hiện có được tái tạo mà không cần 'ons_code' cũng là 'name'? – OYRM

Trả lời

3

Thử thêm đối số unique. Nhìn vào mã nguồn LayerMapping rằng nên làm một bản cập nhật nếu mô hình đã tồn tại, nhưng tôi đã không kiểm tra nó, vì vậy cho tôi biết nếu nó hoạt động:

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

EDIT

Nhưng đối với nó thực sự cập nhật trường cần thiết để ghi đè phương thức LayerMapping.save. Thật không may là nó không thể làm cho nó rất khô. Mở rộng LayerMapping và sao chép tất cả các mã từ gốc lưu và thay thế dòng 561 - 565 như vậy:

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

Cảm ơn bạn đã trả lời và xin lỗi vì trả lời chậm trễ. Thật không may này bây giờ tạo ra lỗi sau: 'File" /Users/me/.virtualenvs/project/lib/python2.7/site-packages/django/contrib/gis/utils/layermapping.py ", dòng 564, trong _save geom .add (g) AttributeError: đối tượng 'Polygon' không có thuộc tính 'add'' – Richard

+0

@Richard, tôi có thể thấy vấn đề là gì, khi cập nhật nó cố gắng thêm hình học mới vào một tập hợp các hình học, mà nó giả định đã được đính kèm đến cánh đồng. Dường như với tôi như lỗi, hoặc tính năng được thiết kế kém. Vì vậy, cách duy nhất để đạt được những gì bạn đang cố gắng làm là tùy chỉnh phương thức 'LayerMapping.save'. Tôi sẽ thêm nó vào câu trả lời. –

Các vấn đề liên quan