Я переношу набор данных из файла адресов .CSV в модель в Django через плагин ImportExport , и в момент сохранения модель запускает процесс геокодирования с GeoPy.
90% времени, когда это работает, но есть несколько записей, которые появляются со следующей ошибкой:
... в save _, latlon =geocoder.geocode (address) TypeError: невозможно распаковать не повторяемый объект NoneType
Я предполагаю, что геокодирование не находит адрес, но я не уверен, почему он не просто покидает полеопорожнить. Я просмотрел соответствующие разделы в Django Docs, GeoPy docs и docs, но, похоже, не нашел никаких подсказок относительно того, как это исправить.
ниже приведен более полный вывод ошибок трассировки. :
Трассировка (последний последний вызов):
Файл "C: \ Users \ henry \ webvenv \ aavenv \ lib \ site-packages \ import_export \ resources.py",строка 522, в import_row
self.save_instance (экземпляр с использованием_транзакций, dry_run)
Файл "C: \ Users \ henry \ webvenv \ aavenv \ lib \ site-packages \ import_export \ resources. py ", строка 315, в save_instance
instance.save ()
Файл" C: \ Users \ henry \ webvenv \ project \ architects \ models.py ", строка 51, в save
_, latlon = geocoder.geocode (address)
TypeError: невозможно распаковать не повторяемый объект NoneType
Ниже приведен файл app / model.py, которыйзаполняется файлом .CSV и выполняет процесс геокодирования:
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()