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

2024-05-29 11:09:07 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,这听起来很愚蠢,我对django和数据库很陌生。在

我要做的是通过模板从数据库中删除多个条目。在

这是我的视图.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是我的模型,下面是我要从中删除的模板:

^{pr2}$

如何从表中检索max pk?并将其替换为“100”:
PS:我知道复选框的名称和id相同(无所谓)
PSS:这段代码可以工作,我可以删除多个条目,但这不是很好的编程。如何改进?在


Tags: todjango视图模板数据库getobjectsnames
3条回答

Anentropic指出了在Python中循环的正确方法:即迭代列表本身,而不是数字范围。在

然而,这仍然效率低下。如果数据库中有一百万行,会发生什么?你真的根本不想迭代。相反,您只需要直接请求数据库删除所需的行。在

在模板中,更改复选框,使其将所有值放在同一参数中:

<input type='checkbox' name="to_delete" value="{{l.id}}"/>

现在在您看来,只需获取值列表并将其删除:

^{pr2}$

你可以这样做:

last_item_pk = Clash.objects.last().pk

查看此处了解详细信息: https://docs.djangoproject.com/en/dev/ref/models/querysets/#last

你不能这样做:

e = Clash.objects.all()
for z in range(0 ,100): ##### need to change this 100 to max(pk)######

相反,您可以直接迭代查询集:

^{pr2}$

这也意味着您也不需要对循环的每次迭代执行此额外的查询:

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

相关问题 更多 >

    热门问题