【发布时间】:2020-02-16 11:36:12
【问题描述】:
我通过ImportExport 插件将来自地址的.CSV 文件的数据集带入Django 中的模型中,并在保存时使用GeoPy 运行地理编码过程。
90% 的时间它可以工作,但有一些条目会出现以下错误:
... 在保存 _, latlon = geocoder.geocode(地址) TypeError: 无法解压不可迭代的 NoneType 对象
我猜地理编码没有找到地址,但我不确定为什么它不只是将字段留空。我在 Django Docs、GeoPy docs 和 google maps geocoding docs 中查找了相关部分,但似乎没有找到任何关于如何修复它的提示。
下面是更完整的追溯错误输出:
Traceback(最近一次调用最后一次):
文件“C:\Users\henry\webvenv\aavev\lib\site-packages\import_export\resources.py”,第 522 行,在 import_row
self.save_instance(instance, using_transactions, dry_run)
文件“C:\Users\henry\webvenv\aavev\lib\site-packages\import_export\resources.py”,第 315 行,在 save_instance 中
instance.save()
文件“C:\Users\henry\webvenv\project\architects\models.py”,第 51 行,保存中
_, latlon = geocoder.geocode(地址)
TypeError: 无法解压不可迭代的 NoneType 对象
下面是由 .CSV 文件填充并运行地理编码过程的 app/model.py:
from django.conf import settings
from urllib.request import URLError
from django.contrib.gis.db import models
from django.contrib.gis import geos
import geopy.geocoders
from geopy.geocoders import GoogleV3
class Architect(models.Model):
id = models.CharField(max_length=100, primary_key=True)
sname = models.CharField(max_length=100)
fname = models.CharField(max_length=100)
a1 = models.CharField(max_length=100)
a2 = models.CharField(max_length=100)
a3 = models.CharField(max_length=100)
a4 = models.CharField(max_length=100)
a5 = models.CharField(max_length=100)
a6 = models.CharField(max_length=100)
pcode = models.CharField(max_length=100)
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
location = models.PointField(u"longitude/latitude", blank=True, null=True)
objects = models.Manager()
#Original def:
# def __str__(self):
# return self.id
def __unicode__(self):
return self.id
def save(self, **kwargs):
if not self.location:
address = u'%s %s %s %s %s %s' % (self.a2, self.a3, self.a4, self.a5, self.a6, self.pcode)
address = address.encode('utf-8')
geocoder = GoogleV3(api_key='my API key')
try:
_, latlon = geocoder.geocode(address)
except (URLError, ValueError):
pass
else:
point = "POINT(%s %s)" % (latlon[1], latlon[0])
self.location = geos.fromstr(point)
super(Architect, self).save()
【问题讨论】:
标签: python django google-maps-api-3 geocoding django-import-export