Django在执行多次查找时重用相同的数据库对象

时间:2014-08-14 11:12:58

标签: python database django caching foreign-keys

这个问题涉及在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

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个邮政编码。