访问外部字段时删除数据库命中

时间:2013-01-08 03:42:42

标签: database django orm

我正在为我的模型创建一个字典,并使用字典来制作json数据。

class MyImage(models.Model):
  ...
  album = models.ForeignKey(Album)
  def to_dict(self):
     result = {}
     result['id'] = self.id
     .. additional data...
     result['album_id'] = self.album.id  // database hit
     result['album_title'] = self.album.title  // another database hit
     result['album_something'] = self.album.something // another hit

我刚刚发现要创建一个MyImage字典,我需要1 + 3,如上面的评论中所述。

我能否以某种方式将数据库命中率降低到1 + 1而不是1 + 3?

2 个答案:

答案 0 :(得分:0)

你可以用1次命中来管理 将数据捕获到值对象(具有所有数据库实体属性的简单类) - 1命中

并从Value Object中提供/构造您的json数据。

答案 1 :(得分:0)

使用select_related。

来自文档

返回一个QuerySet,它将自动“跟随”外键关系,在执行查询时选择其他相关对象数据。这是一个性能提升器,它会导致(有时很多)更大的查询,但意味着以后使用外键关系不需要数据库查询。

# Hits the database.
e = Entry.objects.get(id=5)

# Hits the database again to get the related Blog object.
b = e.blog

# Hits the database.
e = Entry.objects.select_related().get(id=5)

# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog