有没有办法在模型保存函数中使用Django注册的BaseSetting



我正在重写模型的保存函数,以查询Google的Geocoding API中地址的对应纬度/经度坐标,并将其保存到模型中。

我已经用我的API密钥在Django管理中注册了BaseSetting,并希望在我的models.py中访问这个注册的设置,以避免对API密钥进行硬编码。

在视图中处理它不是一个选项,因为我想尽量减少API调用的数量。

这里有一些演示代码:

class DropoffLocationPage(models.Model):
templates = "locations/dropoff_location_page.html"
dropoff_address = models.CharField(max_length=40, blank=False, null=False)
dropoff_city = models.CharField(max_length=40, blank=False, null=False)
dropoff_state = models.CharField(max_length=2, blank=False, null=False)
dropoff_zip = models.CharField(max_length=5, blank=False, null=False)
dropoff_unit_number = models.CharField(max_length=10, blank=True)
dropoff_latitude = models.CharField(max_length=25, blank=True)
dropoff_longitude = models.CharField(max_length=25, blank=True)
def get_coordinates(address):
....
return response['results'][0]['geometry']['location']
def save(self, *args, **kwargs):
address = str(self)
location = get_coordinates(address)
self.dropoff_latitude = location['lat']
self.dropoff_longitude = location['lng']
super(DropoffLocationPage, self).save()
def __str__(self):
return (self.dropoff_address + " " + self.dropoff_city + ", " + self.dropoff_state + " " + self.dropoff_zip + " " + self.dropoff_unit_number)

@register_setting
class GoogleAPISetting(BaseSetting):
maps_api_key = models.CharField(
max_length=255,
help_text="Your Google Maps API Key"
)

您可以使用标准Django ORM方法在保存方法中检索GoogleAPISetting实例。唯一稍微棘手的细节是,如果你在一个Wagtail项目中管理多个站点,在这种情况下,每个站点将有一个设置对象,你需要某种方式来决定要检索哪个。(在视图函数中,这不是问题,因为您总是可以使用GoogleAPISetting.for_request获取与当前请求相对应的设置对象。(

在这种情况下,这可能无关紧要,因为即使你有不止一个网站,也没有真正的理由喜欢一个Google API密钥而不是另一个。因此,您可以要求ORM返回它找到的第一个GoogleAPISetting对象:

def get_coordinates(address):
setting_obj = GoogleAPISetting.objects.first()
api_key = setting_obj.maps_api_key
# ... do something with api_key ...
return response['results'][0]['geometry']['location']

最新更新