好吧这听起来很愚蠢,我对django和数据库都很新。
我正在尝试通过模板从数据库中删除多个条目。
这是我的view.py
def names(request):
e = Clash.objects.all()
for z in range(0 ,100): ##### need to change this 100 to max(pk)######
if request.POST.get('check'+str(z), False):
to_delete = Clash.objects.get(pk=z)
print (to_delete)
to_delete.delete()
return render_to_response("names.html", locals() , context_instance = RequestContext(request))
Clash是我的模型,这是我要删除的模板:
<form method='POST' action=''>
{% csrf_token %}
{% for l in e %}
<p>{{l.name }}
{{l.second_name}}</p>
<input type='checkbox' id="check{{l.id}}" name="check{{l.id}}"/>
{% endfor %}
<br>
<input type='submit' value='Delete Selected'/>
</form>
如何从表中检索max pk?并将其置于“100”的位置:
PS:我知道名称和id是相同的复选框(无关紧要)
PSS:这段代码有效,我可以删除多个条目,但这不是很好的编程。我该如何改进?
答案 0 :(得分:3)
Anentropic指出了在Python中循环事物的正确方法:即迭代列表本身,而不是一系列数字。
然而,这仍然非常低效。如果数据库中有一百万行,会发生什么?你真的不想迭代。相反,您只需要直接询问数据库以删除所需的行。
在模板中,更改复选框,使其将所有值放在同一参数中:
<input type='checkbox' name="to_delete" value="{{l.id}}"/>
现在在您看来,只需获取该值列表并将其删除:
def names(request):
to_delete = request.POST.getlist('to_delete')
if to_delete:
Clash.objects.filter(pk__in=to_delete).delete()
return render_to_response("names.html", locals() , context_instance = RequestContext(request))
答案 1 :(得分:1)
e = Clash.objects.all()
for z in range(0 ,100): ##### need to change this 100 to max(pk)######
相反,您可以直接迭代查询集:
for obj in Clash.objects.all():
这也意味着你也不需要在循环的每次迭代中进行额外的查询:
to_delete = Clash.objects.get(pk=z)
...因为您已经从数据库加载了该对象,如obj
。
所以你可以这样做:
def names(request):
for obj in Clash.objects.all():
if request.POST.get('check'+str(obj.id), False):
print obj
obj.delete()
return render_to_response("names.html", locals() , context_instance=RequestContext(request))
答案 2 :(得分:0)
你可以这样做:
last_item_pk = Clash.objects.last().pk
点击此处了解详情: https://docs.djangoproject.com/en/dev/ref/models/querysets/#last