这个问题涉及在Django中缓存/优化/减少对数据库的调用
我的(假设)场景是我从服务器中提取地址列表,这些地址经常变化。
现在,邮政编码可能在某些地址之间很常见。 我的数据库中已有一个邮政编码列表,模型类似于:
class PostCode(models.Model);
postcode = models.CharField(max_length=10)
country = models.CharField(max_length=100)
name_of_postman = models.CharField(max_length=50)
对于每个地址,我需要创建一个新的地址'对象,并将其存储在数据库中,这需要我查找邮政编码(这是一个外键)
class Address(models.Model):
address_line1 = models.CharField(...)
...
postcode = models.ForeignKey(PostCode, related_name='+')
现在,在迭代从服务器获取的地址时,我发现我必须做以下事情:
for address in all_addresses:
...
if address.is_useful():
Address.objects.create(address_line1=line1, postcode=Postcode.objects.get(postcode=postcode))
正如您所看到的,我每次保存地址时都会检索邮政编码,如果我已经检索到该邮政编码,同时保存了不同的地址,则这不是最佳选择。 我想要做的是优化这个,这样如果对于不同的地址使用相同的邮政编码100次,我就不必从数据库中检索相同的东西100次。
(我不想预先填写所有邮政编码的清单,因为我可能不需要它们(请参阅address.is_useful()
行)
我目前的想法是:
创建一个dict并存储已经获取的对象。类似的东西:
postcodes = {}
for address in all_addresses:
...
if address.is_useful():
Address.objects.create(address_line1=line1, postcode=postcodes.setdefault(postcode, Postcode.objects.get(postcode=postcode)))
这让我想到了数据库缓存的问题。这实际上是数据库缓存实现的目标(虽然稍微复杂一些)?如果是这样,我想我也可以使用数据库缓存。
更新:
我的setdefault()
解决方案无法正常工作,因为default
值无论是什么,都会每次处理,无论是否使用它:
>>> dict = {}
>>> def val():
... print 'running the val() function'
... return 1
...
>>>
>>> dict.setdefault('key', val())
running the val() function
1
>>> dict.setdefault('key', val())
running the val() function
1
答案 0 :(得分:0)
为什么不在进入for循环之前提取邮政编码?
postcode_obj = Postcode.objects.get(postcode=postcode)
for address in all_addresses:
...
Address.objects.create(address_line1=line1, postcode=postcode_obj)
这样你就可以查询1个邮政编码。