Python Django型号:将地址格式化为long/lat-型号未保存
我有个问题。我正在尝试创建一个带有地址的模型,并将其格式化为GPS点。 问题是,当我试图从admin保存时,所有内容都已保存(long和lat除外) 在我的API的仪表板上,所有请求都在这里。我不明白这里怎么了 shop/models.pyPython Django型号:将地址格式化为long/lat-型号未保存,python,django,Python,Django,我有个问题。我正在尝试创建一个带有地址的模型,并将其格式化为GPS点。 问题是,当我试图从admin保存时,所有内容都已保存(long和lat除外) 在我的API的仪表板上,所有请求都在这里。我不明白这里怎么了 shop/models.py from opencage.geocoder import OpenCageGeocode class Supermarket(models.Model): name = models.CharField(null=True,blank=True,
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()
您为longitute和latituede字段提供字符串默认值,而它们获得整数值。您的意思是我必须更改longitute=models.DecimalField of longitute=models.IntegerField(无默认值)。很抱歉,我开始想,在你的
模型.py
中,你对save
方法的实现是错误的,你能纠正我的save方法吗?你进行了递归,所以如果你不想递归地实现save
方法,你必须在默认参数中给出commit=True
,无需*args、**kwargs?因为我遇到了一个致命的问题“很抱歉,出了点问题。”。已记录该问题以供调查。请稍后再试。“我必须删除此def\uu str\uuu(self):返回self.name。问题已经解决,但现在我得到了这个,save()得到了一个意外的关键字参数“commit”