我正在使用调查应用程序,因此我需要将用户给出的所有答案保存在数据库中。我这样做的方式是这样的:
for key, value in request.POST.items():
if key != 'csrfmiddlewaretoken': # I don't want to save the token info
item = Item.objects.get(pk=key) # I get the question(item) I want to save
if item == None:
return render(request, "survey/error.html")
Answer.objects.create(item= item, answer=value, user = request.user)
考虑到django默认情况下会关闭与数据库的连接(即不使用持久连接)。我的问题是:
例如,如果词典有60个问题的答案(因此它将重复60次),它将打开和关闭连接60次,还是仅执行一次?
< / li>是否有更好的方法手动保存POST信息? (不使用Django表单,因为出于各种原因,我目前需要手动执行此操作)
答案 0 :(得分:2)
这绝对不是 批量存储Answer
的好方法,因为:
Item
对象; 我们可以批量创建对象以减少查询数量。通常,我们将使用单个查询创建所有元素,尽管取决于数据库和数据量,它可能需要有限数量的查询。
我们进一步不需要完全获取相关的Item
对象, ,我们只需设置item_id
字段, item
ForeignKey
字段的“双胞胎”,例如:
从django.db导入IntegrityError
try:
answers = [
Answer(item_id=key, answer=value, user=request.user)
for key, value in request.POST.items()
if key != 'csrfmiddlewaretoken'
]
Answer.objects.bulk_create(answers)
except IntegrityError:
return render(request, 'survey/error.html')
bulk_create
将在少量查询中插入所有对象,从而大大减少了请求时间。
请注意,bulk_create
有一些限制(在文档页面上列出)。仔细阅读这些内容并加以考虑可能会很有用。尽管我认为在给定的情况下这些都不相关,但最好还是了解所使用工具的局限性。