python - Django模型:将地址格式化为long / lat - 模型不保存
问题描述
我有个问题。我正在尝试创建一个带有地址的模型并将其格式化为 GPS 点。问题是当我尝试从管理员保存时,所有内容都已保存(除了 long 和 lat)。
在我的 API 的仪表板上,所有的请求都在这里。我不明白这里有什么问题。
商店/models.py
from opencage.geocoder import OpenCageGeocode
class Supermarket(models.Model):
name = models.CharField(null=True,blank=True,max_length=300)
street = models.CharField(null=True,blank=True,max_length=300)
number_street = models.CharField(null=True,blank=True,max_length=20)
town = models.CharField(null=True,blank=True,max_length=60)
zipcode = models.CharField(null=True,blank=True,max_length=20)
latitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
longitude = models.DecimalField(max_digits=9, decimal_places=6, blank=True, default='0')
slug = models.SlugField(editable=False)
def __str__(self):
return self.name
def save(self, *args,**kwargs):
self.slug = slugify(self.name)
address = " ".join([self.number_street, self.street, self.zipcode, self.town])
key = 'xxxx'
geocoder = OpenCageGeocode(key)
result = geocoder.geocode(address, no_annotations='1')
if result:
self.longitude = result[0]['geometry']['lng']
self.latitude = result[0]['geometry']['lat']
self.save()
super().save(*args, **kwargs)
我试过了,一切都很好:所以我真的不明白这里有什么问题
>>> from opencage.geocoder import OpenCageGeocode
>>> from pprint import pprint
>>> key = 'xxxxx'
>>> query = u'XXXXX'
>>> results = geocoder.geocode(query)
>>> print(u'%f;%f;%s;%s' % (results[0]['geometry']['lat'],
... results[0]['geometry']['lng'],
... results[0]['components']['country_code'],
... results[0]['annotations']['timezone']['name']))
XX.XXXXXX;X.XXXXXX;fr;Europe/Paris
更新 - 真的很容易
def __str__(self):
return self.name
def save(self, *args,**kwargs):
self.slug = slugify(self.name)
supermarket = super().save()
address = " ".join([self.number_street, self.street, self.zipcode, self.town])
result = geocoder.geocode(address)
if result and len(result):
self.longitude = result[0]['geometry']['lng']
self.latitude = result[0]['geometry']['lat']
super(Supermarket, self).save(*args, **kwargs)
解决方案
请尝试以下
key = 'xxxx'
geocoder = OpenCageGeocode(key)
class Supermarket(models.Model):
...
def save(self, commit=True):
supermarket = super().save(commit=False)
self.slug = slugify(self.name)
address = " ".join([self.number_street, self.street, self.zipcode, self.town])
result = geocoder.geocode(address, no_annotations='1')
if result and commit:
self.longitude = result[0]['geometry']['lng']
self.latitude = result[0]['geometry']['lat']
supermarket.save()
推荐阅读
- python - 在 pandas 中查找具有一列值作为另一列中的子字符串以及其他 OR 条件的行
- express - 如何使用 hbs 进行 Express 异步搜索渲染?
- python - 作为 Windows 10 管理员,如何从 Python 以管理员身份运行命令?
- postgresql - 触发器 Postgres 中的行计数错误。我做错了什么?
- terraform - 在 Terraform 中将列表转换为另一个列表
- python - 根据另一个熊猫系列选择不同行中的不同列
- c++ - 为什么需要以复杂的方式进行计算?
- gradle - 如何防止 Gradle 降级依赖项?
- ssh - Ansible 的随机 SSH 权限问题
- c++ - 两个相同的项目:一个有未解决的外部问题,另一个没有