Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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
对Django数据库值执行计算:views.py、template还是Javascript?_Javascript_Jquery_Django_Django Templates_Django Views - Fatal编程技术网

对Django数据库值执行计算:views.py、template还是Javascript?

对Django数据库值执行计算:views.py、template还是Javascript?,javascript,jquery,django,django-templates,django-views,Javascript,Jquery,Django,Django Templates,Django Views,我有一个Django项目,它与PostgreSQL数据库接口;我的一个表大约有450行长,每行包含十几列 必须将每列的值放入不同的公式中,以生成我希望在模板层中显示的最终数据,但每行都将使用相同的计算集进行处理。(换句话说,我想执行12种不同的计算,每次450次。) 我的问题是,以下哪种方法是普遍接受的方法,哪种方法在性能方面是最好的: A) 在models.py中将每个计算作为模型方法写入,在views.py中查询所有感兴趣的对象(同样,大约450个),并将它们直接传递给模板,然后使用Djan

我有一个Django项目,它与PostgreSQL数据库接口;我的一个表大约有450行长,每行包含十几列

必须将每列的值放入不同的公式中,以生成我希望在模板层中显示的最终数据,但每行都将使用相同的计算集进行处理。(换句话说,我想执行12种不同的计算,每次450次。)

我的问题是,以下哪种方法是普遍接受的方法,哪种方法在性能方面是最好的:

A) 在models.py中将每个计算作为模型方法写入,在views.py中查询所有感兴趣的对象(同样,大约450个),并将它们直接传递给模板,然后使用Django的模板语言编写如下内容:

<table>
{% for item in list %}
    <tr>
         <td>{{item.name}}</td>
         ...
    </tr>
{% endfor %}
</table>

{列表%中的项目的%s}
{{item.name}
...
{%endfor%}
(其中,
.name
是一种模型方法)

B) 在views.py文件中形成查询和计算,并将结果组织到一个大字典或列表或JSON中传递给模板(然后使用模板标记对其进行解析)

C) 将所有感兴趣的对象传递给模板(如A),但使用Javascript或jQuery对每个对象的字段执行计算

D) 结合B)和C)在views.py中执行所有数据库查询,然后将原始值作为大字典/列表/JSON对象传递给模板,并使用Javascript/jQuery对这些值执行计算

在我看来,方法A)似乎效率最低,因为它需要在模板层中多次访问数据库。但是它使编写视图和模板变得非常简单(只需要编写12种不同的模型方法)。方法B)似乎遵循了在您的视图中尽可能多地执行逻辑的一般原则,并简单地传递要在模板中显示的最终结果。但它使视图功能变得又长又丑。方法C)和D)将大部分负载放在最终用户的浏览器上,这似乎真的可以减轻服务器的负载,但如果用户关闭了JS,那么显然将无法工作

但是,我想再次知道,对于这种情况,是否有公认的最佳实践,以及从计算角度来看,这是否与最快的方法相矛盾

很明显,如果我错过了最好的方法,请告诉我它会是什么。

方法(C)和(D),尽管诱惑不是最好的方法。客户端的计算机可能运行缓慢,在这种情况下,页面可能会在执行所有这些计算时冻结其浏览器


(A) 似乎是最好的选择,不应该引起额外的查询。如果在单个queryset(例如Model.objects.all())中将对象传递给模板,那么Django应该执行单个查询来获取所有对象,然后在模板中调用该方法时,不应该执行其他查询。如果您的对象与其他对象相关,并且此关系在计算中使用,请确保使用select_related或prefetch_related,因为在每个模型调用中查询相关对象确实会在每个对象的单个查询中发生,除非您预先预取/选择要使用的对象()。

感谢您的响应。我的印象是,只有(C)和(D)依赖于客户端的计算机,而(B)依赖于服务器,因为所有计算都在视图层中执行,只有最终值传递给模板?是的,我有一个打字错误,所以依赖于客户端的是C和D。所以,在一些非常罕见的情况下,有必要使用处理过的信息构建python字典并将其传递给视图,如(B)中所示,例如,如果您需要一次进行涉及多个寄存器的计算,那么通常不能对每个对象调用类方法,使用一个类方法进行计算,使用视图获取必要的查询集,然后在模板中调用该方法并以您喜欢的方式显示结果,这样做更为整洁。您可以使用{%with%}模板标记来存储方法调用的结果。再次感谢@rafadev。出于某种原因,我认为调用模型方法查询数据库;谢谢你澄清这一点。同时也感谢您给我指出
。select_related()
,尽管不幸的是,它并没有使我的应用程序加快很多,尽管它将查询数量减少了一半。我一直在使用方法(A),但一直在寻找一种方法来提高我的应用程序的性能…我想大部分的速度放缓仅仅是来自方法调用,即使它们没有触及数据库。你在使用Django调试工具栏吗?这将帮助您查看每个单独的查询、查询数据库所用的时间以及python处理所有信息所用的时间。。。