2014-12-19 76 views
1

好吧,听起来很愚蠢,我对django和数据库很新。如何从表数据库中检索python中的max(pk)?

我在做什么它通过模板从数据库中删除多个条目。

这里是我的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)) 

冲突是我的模型,这里是我从删除模板:

<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> 

如何从表中检索最大PK?并将其放置在“100”的位置:
PS:我知道名称和ID是相同的复选框(无关紧要)
PSS:此代码工作,我可以删除多个条目,但这不是很好的编程。我如何改进它?

回答

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

你不这样做,是这样的:

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) 

...因为您已经从db中加载了该对象,如obj

所以,你可以这样做:详细内容点击这里

last_item_pk = Clash.objects.last().pk 

检查:

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))