Reputation: 370
I have a question. I'm trying to create a model with address and format it into GPS point. The issue is when I try to save from admin, all is saved (except long and lat).
On the dashboard of my API, all the request are here. I don't understand what's wrong here.
shop/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)
I've tried with and everything works well: So I don't really understand what's wrong here
>>> 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
UPDATE - IT WAS REALLY EASY
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)
Upvotes: 2
Views: 154
Reputation: 5390
This works for me
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()
Upvotes: 1