django - 在 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
解决方案
您调用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)
推荐阅读
- c# - C# 尝试用对象填充二维对象数组
- kubernetes - 在 kubernetes 上持续部署有状态的 apache flink 应用程序
- javascript - 我该如何解决这个创建反应应用程序初始化错误
- java - 使用 Java 中的枚举自运行到完成状态机
- css - 如何在样式或 css 中实现 Whatsapp ChatBubble 的布局,特别是在其时间戳上
- html - 按钮对 Shiny 应用程序中的 slideBar 输入的更改没有反应
- python - 如何使用多索引加快 pandas 的索引?
- javascript - 如果在 Firebase 快照中无法正常工作
- visual-studio-code - 更漂亮的间距
- security - 如何在 Jenkins 中主动添加脚本审批