django教程:question_id来自哪里?

时间:2016-08-11 21:41:32

标签: python django

所以我正在尝试学习django并遵循本教程:https://docs.djangoproject.com/en/1.10/intro/tutorial01/

在关注教程并制作投票应用程序之后,当我回顾并查看代码时,我只是看不出这个“question_id”来自何处。创建模型时不会出现。

以下是模型的代码:

from django.db import models
from django.utils import timezone
import datetime
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.question_text
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text= models.CharField(max_length=200)
    votes = models.IntegerField(default=0)
    def __str__(self):
        return self.choice_text

在view.py中:

from django.shortcuts import render, get_object_or_404
from django.http import HttpResponse, HttpResponseRedirect
from django.http import Http404
from django.template import loader
from django.urls import reverse
from django.views import generic

from .models import Question
from .models import Choice
from django.utils import timezone

def vote(request, question_id):
    question = get_object_or_404(Question, pk=question_id)
    try:
        selected_choice = question.choice_set.get(pk=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,)))

question_id只是从无处出现。

  1. 是否会在创建模型时,django会自动为每个实例创建一个model_id?

  2. 另外,另一个问题是他们为什么选择“pk = question_id”并使用pk。这有关系吗?

  3. urls.py中的

    代码:

    from django.shortcuts import render
    from django.conf.urls import url
    
    from . import views
    
    app_name = 'polls'
    
    urlpatterns = [
        # ex: /polls/
        url(r'^$', views.IndexView.as_view(), name='index'),
        # ex: /polls/5/
        url(r'^(?P<pk>[0-9]+)/$', views.DetailView.as_view(), name='detail'),
        # ex: /polls/5/results/
        url(r'^(?P<pk>[0-9]+)/results/$', views.ResultsView.as_view(),     name='results'),
        # ex: /polls/5/vote/
        url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),
     ]
    
    1. 此外,使用这样的通用视图时:

      class DetailView(generic.DetailView): model =问题 template_name ='polls / detail.html'

    2. 我们可以传递参数(比如question_id)吗?

3 个答案:

答案 0 :(得分:1)

urlpatterns的{​​{1}}列表中,您有以下路线:

urls.py

url实际上是一个正则表达式,因此需要一个字符串来指定整个url系列 url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote') 是正则表达式的命名部分,它定义了该URL的参数。

当调用视图(即question_id)时,从URL解析的views.vote将作为函数参数发送。

例如,如果客户访问网址:

question_id

然后将调用视图函数,如:

 /123/vote/
  
      
  1. 在创建模型时,django会自动为每个实例创建一个model_id吗?
  2.   

  
      
  1. 另外,另一个问题是他们为什么这样做&#34; pk = question_id&#34;然后使用pk。这有关系吗?
  2.   

这里pk代表&#34;主键&#34;。实际上,不同的名称只是一个范围问题并不重要。

vote(request=request, question_id=123) 视图的函数参数名称为&#34; question_id&#34;。 voteget_object_or_404方法中的函数参数名称是&#39; pk&#39;。

它们只是指向同一对象的不同名称(例如,整数question.choice_set.get)。

答案 1 :(得分:1)

  1. 您的陈述是真的,您可以在此处查看Django模型的相关文档:https://docs.djangoproject.com/en/1.10/topics/db/models/#automatic-primary-key-fields
  2. 其中值得注意的是:

      

    默认情况下,Django为每个模型提供以下字段:

    id = models.AutoField(primary_key=True)
    
         

    这是一个自动递增的主键。

         

    如果您想指定自定义主键,请指定   在您的某个字段上primary_key=True。如果Django看到你了   明确设置Field.primary_key,它不会添加自动id   列。

         

    每个模型只需要一个字段primary_key=True(或者   明确声明或自动添加)。

    1. 您可能还想看看这个简要解释Django中ID和主键之间差异的问题: What's the difference between Model.id and Model.pk in django?

    2. 为什么不试一试,看看;)

答案 2 :(得分:0)

根据您的问题,question_id是您创建的Choice表的字段。如果仔细看一下代码,您可能会发现question = models.Foreignkey,它指定了选择表中的每个条目都与问题表中的每个问题相关。

我将要求您运行以下命令

  

python manage.py sqlmigrate轮询0001

当您观察输出时,可以为选择表指定question_id字段,该字段与问题表的id间接对应。

url(r'^(?P<question_id>[0-9]+)/vote/$', views.vote, name='vote'),

因此,当解析http://127.0.0.1:8000/polls/34/vote之类的网址时, question_id =“ 34”部分来自(?P [0-9] +)。在模式周围使用括号“捕获”与该模式匹配的文本,并将其作为参数发送给我们在views.py中创建的view函数,?P定义将用于标识匹配模式的名称,并且[ 0-9] +是一个正则表达式,用于匹配数字序列(即数字)。

另外,我们可以说question_id是表中每个条目的标识符。

  

1。是否是在创建模型时,django会为每个实例自动创建一个model_id?

是的,django为创建的每个实例自动分配唯一的ID