2014-12-19 30 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))