web-dev-qa-db-ja.com

インポートする前にDjango-import-exportでフィールドを解析する

私はDjango-import-exportパッケージを使用して、場所の名前とその経度と緯度を含むcsvファイルを期待しています。

Csvの経度と緯度のフィールドを解析してDjango.contrib.gis.geos.Pointオブジェクトに変換し、Locationモデルのgeomフィールドに入力できるようにしたいと考えています。

# models.py
from Django.contrib.gis.db import models
class Location(models.Model):
    name = models.CharField(max_length=200)
    geom = models.PointField(null=True, blank=True)

    def __str__(self):
        return self.name

# admin.py
from .models import Location
from import_export import resources
from import_export.admin import ImportExportModelAdmin

class LocationResource(resources.ModelResource):
    geom = Field()
    latitude = Field()
    longitude = Field()

    class Meta:
        model = Location
        fields = ('id','name', 'latitude', 'longitude')
        exclude = ('geom')
        export_order = ('id', 'name', 'latitude', 'longitude')

    def dehydrate_geom(self, data):
        return Point(data.longitude, data.longitude)

class LocationAdmin(ImportExportModelAdmin):
    resource_class = LocationResource

admin.site.register(Location, LocationAdmin)

これは私がどれだけ進んだかですが、成功しませんでした。持つ必要があります:

Location(name='name', geom=Point(longitude, latitude))

CSVファイル:locations.csv

id,name,longitude,latitude
1,Naga,120.18,18.20

PDATE 1hydrate_<field_name>を使用してみましたが、成功しませんでした。

class ProjectActivityResource(resources.ModelResource):
    latitude = Field(attribute='latitude', column_name='latitude')
    longitude = Field(attribute='longitude', column_name='longitude')

    class Meta:
        model = ProjectActivity
        fields = ('id', 'project_site', 'name', 'latitude',
                        'longitude', 'date_updated')
        exclude = ('geom')
        export_order = ('id', 'project_site', 'name', 'latitude',
                        'longitude', 'date_updated')

    def hydrate_geom(self, project_activity):
        print(project_activity)
        return Point(float(project_activity.longitude), float(project_activity.longitude))
6
Nikko

@Nikkoと同様に問題が発生しました。自分がやりたいことをするのに本当に苦労し、日光のコードが助けになりました。私は自分がやったことに完全に満足していませんが、それは機能しますで、おそらくそれは一部の人々を助けることができます。 汚いですから、誰かが私に正しい方法を説明したいのなら、私はすべて耳です。

このコードを使用すると、(Django-geojsonからの)PointFieldを含むクラスを、管理インターフェースから(Django-geojsonからの)緯度と経度のみを出力ファイル(すべてのgeojsonではなく)に格納することで、インポートおよびエクスポート(Django-import-exportを使用)できます。ファイル)。

admin.py:

from leaflet.admin import LeafletGeoAdmin
from import_export import resources
from import_export.fields import Field
from import_export.admin import ImportExportModelAdmin
import json

from Django.db import models
from djgeojson.fields import PointField

class SleepSpotResource(resources.ModelResource):
    latitude = Field(attribute='latitude', column_name='latitude')
    longitude = Field(attribute='longitude', column_name='longitude')

    class Meta:
        model = SleepSpot
        fields = ('id','album','title','start_date','end_date','latitude','longitude' )
        exclude = ('geom')
        export_order = ('id','album','title','start_date','end_date','latitude','longitude' )

    def before_save_instance(self, instance, using_transactions, dry_run):
        longitude = float(getattr(instance, 'longitude'))
        latitude = float(getattr(instance, 'latitude'))

        instance.geom = {'type': 'Point', 'coordinates': [longitude, latitude]}
        return instance

    def dehydrate_longitude(self, sleepspot):
        try:
            geomjson = sleepspot.geom
            if type(geomjson) is str:
                geomjson = json.loads(geomjson.replace("\'", "\""))
            return geomjson['coordinates'][0]
        except:
            pass

    def dehydrate_latitude(self, sleepspot):
        try:
            geomjson = sleepspot.geom
            if type(geomjson) is str:
                geomjson = json.loads(geomjson.replace("\'", "\""))
            return geomjson['coordinates'][1]
        except:
            pass

@admin.register(SleepSpot)
class SleepSpotModelAdmin(LeafletGeoAdmin, ImportExportModelAdmin):
    list_display = ('title', 'start_date', 'end_date', 'album')
    resource_class = SleepSpotResource
1
Fritzip

@ Friedrich、PointFieldにはメソッドcoordsがあります。私はこれをテストしませんでした。

私はこれを行います:

def dehydrate_longitude(self, sleepspot):
    return sleepspot.geom.coords[0]

def dehydrate_longitude(self, sleepspot):
    return sleepspot.geom.coords[1]

pointFieldとして保存されている限り:

from Django.contrib.gis.geos import Point
instance.geom = Point(float(instance.longitude), float(instance.latitude))

jSONの代わりに

instance.geom = {'type': 'Point', 'coordinates': [longitude, latitude]}

0
Nikko