如何从表数据库中检索python中的max(pk)?

时间:2014-12-19 06:10:12

标签: python django sqlite checkbox

好吧这听起来很愚蠢,我对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:这段代码有效,我可以删除多个条目,但这不是很好的编程。我该如何改进?

3 个答案:

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