美文网首页
03 - Models and the admin site

03 - Models and the admin site

作者: AureliusShu | 来源:发表于2018-09-12 21:07 被阅读0次

    Models and the admin site

    1. Database setup

      $ pip install mysqlclient
      
    2. Creating models

      from django.db import models
      
      class Question(models.Model):
          question_text = models.CharField(max_length=200)
          pub_date = models.DateTimeField('date published')
      
      class Choice(models.Model):
          question = models.ForeignKey(Question, on_delete=models.CASCADE)
          choice_text = models.CharField(max_length=200)
          votes = models.IntegerField(default=0)
      
    3. Include the app in our project

      INSTALLED_APPS = [
          'polls.apps.PollsConfig',
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
      ]
      
    4. Activating models

      # 生成迁移文件
      $ python manage.py makemigrations polls
      # 执行指定迁移
      $ python manage.py migrate polls 0001
      # 执行全部迁移
      $ python manage.py migrate
      
    5. Playing with the API

      # 进入Database API
      $ python manage.py shell
      
      # Import the model classes we just wrote.
      >>> from polls.models import Choice, Question  
      
      # No questions are in the system yet.
      >>> Question.objects.all()
      <QuerySet []>
      
      # Create a new Question.
      # Support for time zones is enabled in the default settings file, so
      # Django expects a datetime with tzinfo for pub_date. Use timezone.now()
      # instead of datetime.datetime.now() and it will do the right thing.
      >>> from django.utils import timezone
      >>> q = Question(question_text="What's new?", pub_date=timezone.now())
      
      # Save the object into the database. You have to call save() explicitly.
      >>> q.save()
      
      # Now it has an ID.
      >>> q.id
      1
      
      # Access model field values via Python attributes.
      >>> q.question_text
      "What's new?"
      >>> q.pub_date
      datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
      
      # Change values by changing the attributes, then calling save().
      >>> q.question_text = "What's up?"
      >>> q.save()
      
      # objects.all() displays all the questions in the database.
      >>> Question.objects.all()
      <QuerySet [<Question: Question object (1)>]>
      
      # 通过给polls/models.py 中的模型添加__str__()方法
      # 让Question.objects.all()的调用显示对于的值
      from django.db import models
      
      class Question(models.Model):
          # ...
          def __str__(self):
              return self.question_text
      
      class Choice(models.Model):
          # ...
          def __str__(self):
              return self.choice_text
      
      >>> from polls.models import Choice, Question
      
      # Make sure our __str__() addition worked.
      >>> Question.objects.all()
      <QuerySet [<Question: What's up?>]>
      
      # Django provides a rich database lookup API that's entirely driven by
      # keyword arguments.
      >>> Question.objects.filter(id=1)
      <QuerySet [<Question: What's up?>]>
      >>> Question.objects.filter(question_text__startswith='What')
      <QuerySet [<Question: What's up?>]>
      
      # Get the question that was published this year.
      >>> from django.utils import timezone
      >>> current_year = timezone.now().year
      >>> Question.objects.get(pub_date__year=current_year)
      <Question: What's up?>
      
      # Request an ID that doesn't exist, this will raise an exception.
      >>> Question.objects.get(id=2)
      Traceback (most recent call last):
          ...
      DoesNotExist: Question matching query does not exist.
      
      # Lookup by a primary key is the most common case, so Django provides a
      # shortcut for primary-key exact lookups.
      # The following is identical to Question.objects.get(id=1).
      >>> Question.objects.get(pk=1)
      <Question: What's up?>
      
      # Make sure our custom method worked.
      >>> q = Question.objects.get(pk=1)
      >>> q.was_published_recently()
      True
      
      # Give the Question a couple of Choices. The create call constructs a new
      # Choice object, does the INSERT statement, adds the choice to the set
      # of available choices and returns the new Choice object. Django creates
      # a set to hold the "other side" of a ForeignKey relation
      # (e.g. a question's choice) which can be accessed via the API.
      >>> q = Question.objects.get(pk=1)
      
      # Display any choices from the related object set -- none so far.
      >>> q.choice_set.all()
      <QuerySet []>
      
      # Create three choices.
      >>> q.choice_set.create(choice_text='Not much', votes=0)
      <Choice: Not much>
      >>> q.choice_set.create(choice_text='The sky', votes=0)
      <Choice: The sky>
      >>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
      
      # Choice objects have API access to their related Question objects.
      >>> c.question
      <Question: What's up?>
      
      # And vice versa: Question objects get access to Choice objects.
      >>> q.choice_set.all()
      <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
      >>> q.choice_set.count()
      3
      
      # The API automatically follows relationships as far as you need.
      # Use double underscores to separate relationships.
      # This works as many levels deep as you want; there's no limit.
      # Find all Choices for any question whose pub_date is in this year
      # (reusing the 'current_year' variable we created above).
      >>> Choice.objects.filter(question__pub_date__year=current_year)
      <QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
      
      # Let's delete one of the choices. Use delete() for that.
      >>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
      >>> c.delete()
      
    6. Creating an admin user

      $ python manage.py createsuperuser
      Username: admin
      Email address: admin@example.com
      Password: **********
      Password (again): *********
      Superuser created successfully.
      
    7. Make the poll app modifiable in the admin

      # polls/admin.py
      from django.contrib import admin
      from .models import Question
      
      admin.site.register(Question)
      

    相关文章

      网友评论

          本文标题:03 - Models and the admin site

          本文链接:https://www.haomeiwen.com/subject/tqnbgftx.html