首页 > 解决方案 > 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)

标签: pythondjango

解决方案


请尝试以下

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()

推荐阅读