Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django使用外键选择所有型号_Python_Sql_Django_Postgresql - Fatal编程技术网

Python Django使用外键选择所有型号

Python Django使用外键选择所有型号,python,sql,django,postgresql,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)

在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循环,并使用服务器名称搜索每个info表。问题是,有时我需要进行API调用,以返回所有服务器及其信息

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


有没有简单的方法可以执行某种类型的联接或外键搜索来减少数据库调用的数量以加快速度?

您想要的是对要获取的所有相关类型执行选择相关。例如:

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

我应该指出,如果这个应用程序被重用,并且有人开始向服务器添加更多的外键,那么这些外键当然都会与select_相关。

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

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

我应该指出,如果这个应用程序被重用,并且有人开始向服务器添加更多的外键,那么这些外键当然都会与select_相关。

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

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

我应该指出,如果这个应用程序被重用,并且有人开始向服务器添加更多的外键,那么这些外键当然都会与select_相关。

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

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


我应该指出,如果这个应用程序被重用,并且有人开始向服务器添加更多的外键,那么这些外键当然都会与select相关。

select\u-related
可能是您想要的:
select\u-related
可能是您想要的:
select_related
可能是您想要的:我很困惑,因为在django文档中,select_related似乎用于与我想要做的相反的用途。也就是说,使用外键选择相关模型,它将查找模型表。我还收到一个错误,指出查询集没有find one属性,所以我认为这不是一个有效的方法。@Josh Whoops,意思是first()没有find one(),mongodb太多了。另外,你对文档的评论是准确的,有点混乱。但是iirc select_related只是在
之后用来访问数据的相同名称上运行,并在此后使用
的任何地方使用
(如
res.serverinfo\u set。其他某个外键
将是
serverinfo\u set\u\u其他某个外键
,因此在我的服务器模型中,我有一个外键引用到数据中心。我在使用与select\u相关的命令时出错,说数据中心是唯一可用的选项。@Josh-Hmm,你是对的。显然,这就是预取_related是用于。不知他们是否更改了它,或者我只是不知道。我很困惑,因为在django文档中,似乎select_related用于与我想做的相反的操作。也就是说,您使用外键将模型与select关联,它会找到模型表。我还收到一个错误,指出查询集没有属性“但是你要找到一个,所以我认为这不是一个有效的方法。”“乔希,哎呀,意思是第一个()找不到一个(),太多mongodb了。此外,您对文档的评论是准确的,有点令人困惑。但是iirc select_related只使用与您在
之后访问数据时使用的名称相同的名称,并在此后使用
的任何地方使用
(如
res.serverinfo\u set。其他某个外键
将是
serverinfo\u set\u\u其他某个外键
,因此在我的服务器模型中,我有一个外键引用到数据中心。我在使用与select\u相关的命令时出错,说数据中心是唯一可用的选项。@Josh-Hmm,你是对的。显然,这就是预取_related是用于。不知他们是否更改了它,或者我只是不知道。我很困惑,因为在django文档中,似乎select_related用于与我想做的相反的操作。也就是说,您使用外键将模型与select关联,它会找到模型表。我还收到一个错误,指出查询集没有属性“但是你要找到一个,所以我认为这不是一个有效的方法。”“乔希,哎呀,意思是第一个()找不到一个(),太多mongodb了。此外,您对文档的评论是准确的,有点令人困惑。但是iirc select_related只使用与您在
之后访问数据时使用的名称相同的名称,并在此后使用
的任何地方使用
(如
res.serverinfo\u set。其他某个外键
将是
serverinfo\u set\u\u其他某个外键
,因此在我的服务器模型中,我有一个外键引用到数据中心。我在使用与select\u相关的命令时出错,说数据中心是唯一可用的选项。@Josh-Hmm,你是对的。显然,这就是预取_related是用于。不知他们是否更改了它,或者我只是不知道。我很困惑,因为在django文档中,似乎select_related用于与我想做的相反的操作。也就是说,您使用外键将模型与select关联,它会找到模型表。我还收到一个错误,指出查询集没有属性但是请找一个,所以我认为这不是一个有效的方法。@Josh Wh