首页 > 解决方案 > 在 django 模型中修改 save() 不断循环

问题描述

我正在尝试创建一个基于 Google Map API 的模型。

如果对象不存在,我想保存名称、地址、经度、纬度和 google 地点 ID。下面是我的代码:但是,当我运行它时,它会进入一个循环并停止检查谷歌地图。你能告诉我有什么问题吗?

class Place(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    address = models.CharField(max_length=200, null=True, blank=True)
    logitude = models.CharField(max_length=20, null=True, blank=True)
    latitude = models.CharField(max_length=20, null=True, blank=True)
    id_google = models.CharField(max_length=50, null=True, blank=True)

    date_created = models.DateTimeField(_('date created'), default=timezone.now)
    date_modified = models.DateTimeField(_('date_modified'), auto_now=True)

    def __str__(self):
        return self.name

    def save(self, *args, **kwargs):
        try:
            place = Place.objects.get(name=self.name)
        except Place.DoesNotExist:
            gmaps = googlemaps.Client(key=settings.GOOGLE_MAPS_API_KEY)
            geocode_result = gmaps.geocode(self.address)
            place = Place(name=self.name, 
                        address=geocode_result[0]['formatted_address'],
                        logitude=geocode_result[0]['geometry']['location']['lng'],
                        latitude=geocode_result[0]['geometry']['location']['lat'],
                        id_google=geocode_result[0]['place_id'], 
                        )
            place.save()
        return place

标签: djangodjango-models

解决方案


您调用place.save()save(..)方法,从而触发另一个保存。您可能可以就地编辑项目,然后使用super().save()调用保存它:

class Place(models.Model):

    # ...

    def save(self, *args, **kwargs):
        try:
            place = Place.objects.get(name=self.name)
        except Place.DoesNotExist:
            gmaps = googlemaps.Client(key=settings.GOOGLE_MAPS_API_KEY)
            geocode_result = gmaps.geocode(self.address)[0]
            self.address = geocode_result['formatted_address']
            location = geocode_result['geometry']['location']
            self.logitude = location['lng']
            self.latitude = location['lat']
            self.id_google = geocode_result['place_id']
            super().save(*args, **kwargs)

推荐阅读