Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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_Django_Json_Django Templates_Ember Data - Fatal编程技术网

Python 我应该担心Django模板效率低下吗?

Python 我应该担心Django模板效率低下吗?,python,django,json,django-templates,ember-data,Python,Django,Json,Django Templates,Ember Data,我对Django比较陌生,我正在使用1.5版构建RESTAPI。对api的调用期望返回JSON(我将其用于Ember.js前端) 我想知道我是否不能这样做: def listproject(request, pk_id): # list single project at /projects/<pk_id> project = Project.objects.get(pk = pk_id) snapshots = Snapshot.objects.filter(proje

我对Django比较陌生,我正在使用1.5版构建RESTAPI。对api的调用期望返回JSON(我将其用于Ember.js前端)

我想知道我是否不能这样做:

def listproject(request, pk_id):
  # list single project at /projects/<pk_id>
  project = Project.objects.get(pk = pk_id)
  snapshots = Snapshot.objects.filter(project = project)

  # (both are same up to here)

  return render_to_response('project.json',
    {"project":project, "snapshots":snapshots},
    mimetype="text/json")
与Django共事的时间比我长得多的人认为,使用模板来实现这一点效率低下。他建议我做以下几点:

def listproject(request, pk_id):
  # list single project at /projects/<pk_id>
  project = Project.objects.get(pk = pk_id)
  snapshots = Snapshot.objects.filter(project = project)

  # (both are same up to here)

  ret_json = []
  ret_json.append('{"id": "' + str(project.pk) + '", ')
  ret_json.append('"name": "' + project.name + '", "snapshot_ids": [')

  snapshot_json = []
  for snapshot in snapshots:
    snapshot_json.append('"' + str(snapshot.pk) + '",')
  ret_json.append(''.join(snapshot_json)[0:-1] + ']}')

  return HttpResponse(content=''.join(ret_json), mimetype="text/json")
def列表项目(请求,主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
#(到目前为止,两者都是相同的)
ret_json=[]
ret_json.append(“{”id:“'+str(project.pk)+',”)
ret_json.append(“'name:”+project.name+”,“snapshot_id:[”)
快照_json=[]
对于快照中的快照:
snapshot_json.append(“”+str(snapshot.pk)+“,”)
ret_json.append(''.join(快照_json)[0:-1]+']}')
返回HttpResponse(content=''.join(ret_json),mimetype=“text/json”)
我都试过了。虽然我的版本生成了更可读的JSON,但它们的工作原理相同


请帮助我们结束辩论!哪个更有效(为什么)?

Django模板确实不是特别有效。但是,只有当您有非常大的模板,并且这些模板本身扩展或包含许多其他模板时,例如在复杂的内容管理系统中,这才是真正的问题。对于包含少量字段的单个模板,与服务请求的总体开销相比,模板呈现是微不足道的

也就是说我对你的两个选择都有点困惑。为什么不通过标准的
JSON
库生成JSON?这是正确的方法,而不是在模板或Python代码中构建字符串

ret = {'id': project.id,
       'name': project.name,
       'snapshot_ids': [snapshot.id for snapshot in snapshots]}
ret_json = json.dumps(ret)

Django模板确实不是特别有效。但是,只有当您有非常大的模板,并且这些模板本身扩展或包含许多其他模板时,例如在复杂的内容管理系统中,这才是真正的问题。对于包含少量字段的单个模板,与服务请求的总体开销相比,模板呈现是微不足道的

也就是说我对你的两个选择都有点困惑。为什么不通过标准的
JSON
库生成JSON?这是正确的方法,而不是在模板或Python代码中构建字符串

ret = {'id': project.id,
       'name': project.name,
       'snapshot_ids': [snapshot.id for snapshot in snapshots]}
ret_json = json.dumps(ret)

这两种选择在我看来都很可怕。我希望尽可能避免“手工编写”JSON,而只是直接从Python数据结构转换

幸运的是,
json
模块就是为此而设计的

import json

def listproject(request, pk_id):
    # list single project at /projects/<pk_id>
    project = Project.objects.get(pk=pk_id)
    snapshots = Snapshot.objects.filter(project=project)
    data = {
      "id": project.pk,
      "name": project.name,
      "snapshot_ids": [snapshot.pk for snapshot in snapshots],
    }
    return HttpResponse(content=json.dumps(data), mimetype="text/json")
导入json
def列表项目(请求、主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
数据={
“id”:project.pk,
“名称”:project.name,
“快照_id”:[快照中快照的snapshot.pk],
}
返回HttpResponse(content=json.dumps(data),mimetype=“text/json”)
避免“手工编写”代码的原因显而易见——避免打字错误,代码更短更简单,json模块可能更快

如果您担心生成的JSON的“可读性”,JSON模块会提供一些选项来控制输出(缩进等):

这两个选项对我来说都很可怕。我希望尽可能避免“手工编写”JSON,而只是直接从Python数据结构转换

幸运的是,
json
模块就是为此而设计的

import json

def listproject(request, pk_id):
    # list single project at /projects/<pk_id>
    project = Project.objects.get(pk=pk_id)
    snapshots = Snapshot.objects.filter(project=project)
    data = {
      "id": project.pk,
      "name": project.name,
      "snapshot_ids": [snapshot.pk for snapshot in snapshots],
    }
    return HttpResponse(content=json.dumps(data), mimetype="text/json")
导入json
def列表项目(请求、主键id):
#在/个项目中列出单个项目/
project=project.objects.get(pk=pk\u id)
快照=快照.objects.filter(项目=项目)
数据={
“id”:project.pk,
“名称”:project.name,
“快照_id”:[快照中快照的snapshot.pk],
}
返回HttpResponse(content=json.dumps(data),mimetype=“text/json”)
避免“手工编写”代码的原因显而易见——避免打字错误,代码更短更简单,json模块可能更快

如果您担心生成的JSON的“可读性”,JSON模块会提供一些选项来控制输出(缩进等):

我通常使用这个小功能:

import json
from django.http import HttpResponse

def json_response(ob):
    return HttpResponse(
        json.dumps(ob), mimetype="application/json")
因此,您可以从视图中返回结果:

def listproject(request, pk_id):
    project = Project.objects.get(pk=pk_id)  # Use get_object_or_404 ?
    snapshots = Snapshot.objects.filter(project=project)
    return json_response({
       "id": project.pk,
       "name": project.name,
       "snapshot_ids": [snapshot.pk for snapshot in snapshots],
    })

我通常使用这个小功能:

import json
from django.http import HttpResponse

def json_response(ob):
    return HttpResponse(
        json.dumps(ob), mimetype="application/json")
因此,您可以从视图中返回结果:

def listproject(request, pk_id):
    project = Project.objects.get(pk=pk_id)  # Use get_object_or_404 ?
    snapshots = Snapshot.objects.filter(project=project)
    return json_response({
       "id": project.pk,
       "name": project.name,
       "snapshot_ids": [snapshot.pk for snapshot in snapshots],
    })

你为什么只问效率?这不是唯一的标准(您编写Python时,开始时的速度比必要时慢好几倍!)。写作和修改的容易程度如何?那么可理解性呢?很好!不过,这是为生产代码设计的,所以它的要求要严格一些。Daniel和Anentropic的答案除了是“正确的方式”之外,更易于书写、更改和理解。到处都是职业选手!你为什么只问效率?这不是唯一的标准(您编写Python时,开始时的速度比必要时慢好几倍!)。写作和修改的容易程度如何?那么可理解性呢?很好!不过,这是为生产代码设计的,所以它的要求要严格一些。Daniel和Anentropic的答案除了是“正确的方式”之外,更易于书写、更改和理解。到处都是职业选手<代码>'snapshot\u id':[snapshot.id用于快照中的快照]我不熟悉这种语法。作为参考:。现在看起来很明显,但我发誓事实并非如此!谢谢你的回答,丹尼尔!列表理解也可以再次用于使项目数组成为版本。避免字符串攻击感觉很好=)
快照id:[snapshot.id用于快照中的快照]
我是