Django选择所有带外键的模型

时间:2015-07-01 22:22:33

标签: python sql django postgresql

在Django Web应用程序中,我定义了一个名为Server

的模型
class Server(models.model):

以及一组使用此模型作为外键的模型

class ServerInfo(models.Model):
    server = models.ForeignKey(server, null=True)
class ServerDNSRecord(models.Model):
    server = models.ForeignKey(server, null=True)
...etc

现在我有一个API调用返回一个包含所有附加信息的服务器。目前我只是为每个服务器执行for循环,并使用服务器的名称搜索每个信息表。问题是有时我需要进行API调用,返回所有服务器及其信息。

这会为数据库创建大量的SQL查询,并且此调用的响应时间通常大于5秒,这是不可接受的。

是否有任何简单的方法可以进行某种连接或外键搜索以减少数据库调用量以加快速度?

1 个答案:

答案 0 :(得分:2)

您想要的是对您将要抓取的所有相关类型执行select_related。例如:

res = Server.objects.prefetch_related("serverinfo_set", "serverdnsrecord_set", ...).first()
res.serverinfo_set # Won't need another query
res.serverdnsrecord_set # Won't need another query

此外,如果您想自动执行此操作,您可以执行以下操作:

related_fieldnames = [f.get_accessor_name() for f in Server._meta.get_all_related_objects()]
res = Server.objects.prefetch_related(*related_fieldnames).first()
res.serverinfo_set # Won't need another query
res.serverdnsrecord_set # Won't need another query

我应该指出,如果这个应用程序被重用,并且有人开始使用更多的ForeignKeys到服务器,那么那些当然会得到select_related。