4

我试图通过缓存结果并在即将到来的查询中使用来优化来自管理员的 dbase 查询。但是 - 我仍然看到每个条目的 dbase 请求。

我有一个这样的模型:

class actions(models.Model):
   user = models.ForeignKey(MyUser)
   action = ...

class Myuser(Models.Model):
   name = models.CharField()
   company = models.ForeignKey(Companies)

在管理员 change_list 中,我希望看到一个包含以下内容的表格:

user    action    company_name

所以我将我的管理员定义如下:

class ActionsAdmin(admin.ModelAdmin):
  list_display = ('user','action','company_name')
  ...

 def company_name(self,instance):
   return instance.user.company

当我运行它时,我看到对于每个用户,都有一个对公司模型的查询以提取公司的名称。但是,由于公司不多,而且在很多情况下,用户一次又一次地执行许多操作,我想查询所有公司一次,然后使用缓存的结果而不是访问每个条目的 dbase。

我怎样才能做到这一点?

4

1 回答 1

6

使用list_select_related指定要与查询选择的关系,因此在您的情况下:

class ActionsAdmin(admin.ModelAdmin):
  list_display = ('user','action','company_name')
  list_select_related = ('user__company', )
  ...

 def company_name(self,instance):
   return instance.user.company

编辑:

也可以直接在 上指定字段list_display,不需要自定义方法。

它应该list_select_related为您处理(至少根据上面链接的文档)。如果假设您的Companies模型有一个name字段:

class ActionsAdmin(admin.ModelAdmin):
  list_display = ('user','action','user__company__name')
于 2013-08-05T13:25:54.873 回答