Django踩坑:PK

原文引用 大专栏  https://www.dazhuanlan.com/2019/08/26/5d634d9cb14d2/

《第一个Django应用》中,我根据教程总结了我对于Django应用开发过程的初步理解以及对应用开发步骤的梳理,在我尝试仅根据博文内容对应用进行复现的过程中出现了如下错误:

这个错误出现在我进入polls主页后选择其中一项标题进行投票时,投票结束后跳转到了http://127.0.0.1:8000/polls/1/vote/,本来按道理应该是http://127.0.0.1:8000/polls/1/results/,于是我将检查目标定在了/polls/views.py文档的vote()方法里,因为我在这个方法里设置了页面的跳转,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
def vote(request, question_id):
question = get_object_or_404(Question, pk=question_id)
try:
selected_choice = question.choice_set.get(request.POST['choice'])
except (KeyError, Choice.DoesNotExist):
return render(request, 'polls/detail.html', {
'question': question,
'error_message': "You didn't select a choice.",
})
else:
selected_choice.votes += 1
selected_choice.save()
return HttpResponseRedirect(reverse('polls:results', args=(question.id,)))

分析解决

结合报错信息’not enough values to unpack(excepted 2, got 1)’,意思是在解包过程中少了一个数值,通过检察源码找到get()方法的信息:Perform the query and return a single object matching the given keyword arguments.通过给定的关键词语句执行查询并返回匹配的对象。request.POST是一个类似字典的对象,允许你通过键名访问提交的数据。本例中,request.POST[’choice’]返回被选择选项的ID,而ID是主键,因此改为pk=request.POST['choice']即可。

总结

在创建一个新的models实例时,如果没有设置主键,那么Django会自动创建一个id字段作为该模型的主键,有时候用id和pk都能达到预期的效果,但是pk更加独立于真正的主键,也就是说不用在意主键是叫id或者是object_id。并且使用pk可以提高一致性,即便模型中有不同的主键。

参考资料

猜你喜欢

转载自www.cnblogs.com/JimmyShen/p/11411771.html