导入之前解析django-import-export中的字段

Nik*_*kko 6 python django django-models geodjango 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)
Run Code Online (Sandbox Code Playgroud)

这是我取得的成就,但没有成功。一定有:

Location(name='name', geom=Point(longitude, latitude))
Run Code Online (Sandbox Code Playgroud)

CSV档案:locations.csv

id,name,longitude,latitude
1,Naga,120.18,18.20
Run Code Online (Sandbox Code Playgroud)

更新1 尝试使用hydrate_<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))
Run Code Online (Sandbox Code Playgroud)

Nik*_*kko 9

我用的时候解决了 before_save_instance(self, instance, using_transactions, dry_run)

该函数可以在将对象传递给模型之前对其进行修改。

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 before_save_instance(self, instance, using_transactions, dry_run):
        instance.geom = Point(float(instance.longitude), float(instance.latitude))
        return instance
Run Code Online (Sandbox Code Playgroud)