Django笔记——第一个Django应用【基本的投票应用程序】2——【数据库配置、API接口】

数据库配置

mysite/settings.py  这是个包含了 Django 项目设置的 Python 模块。

这个配置文件使用 SQLite 作为默认数据库,python内置SQLite。

 

如何使用其他的数据库?

  • 安装合适的 database bindings
  • 改变设置文件中 DATABASES 'default' 项目中的一些键值

ENGINE可选值:

  1. 'django.db.backends.sqlite3'
  2. 'django.db.backends.postgresql'
  3. 'django.db.backends.mysql'
  4.  'django.db.backends.oracle'
  5.   其它后端

NAME数据库名称

如果使用的是 SQLite,数据库将是你电脑上的一个文件,在这种情况下, NAME 应该是此文件的绝对路径,包括文件名。默认值 os.path.join(BASE_DIR, 'db.sqlite3') 将会把数据库文件储存在项目的根目录。

如果你不使用 SQLite,则必须添加一些额外设置,比如 USERPASSWORDHOST 等等。

 

创建数据表

INSTALLED_APPS 设置项。这里包括了会在你项目中启用的所有 Django 应用。

默认开启的某些应用需要至少一个数据表,所以,在使用他们之前需要在数据库中创建一些表。

#migrate 命令检查 INSTALLED_APPS 设置,为其中的每个应用创建需要的数据表
python manage.py migrate

 

怎样关闭默认开启的应用?

如果你不需要某个或某些应用,你可以在运行 migrate 前从 INSTALLED_APPS 里注释或者删除掉它们。 migrate 命令只会为在 INSTALLED_APPS 里声明了的应用进行数据库迁移。

 

创建模型

在 Django 里写一个数据库驱动的 Web 应用的第一步是定义模型,数据库结构设计和附加的其它元数据。

在这个简单的投票应用中,需要创建两个模型:

问题 Question 和选项 Choice

  • Question 模型包括问题描述和发布时间。
  • Choice 模型有两个字段,选项描述和当前得票数。

每个选项属于一个问题。

polls/models.py

#导入models模块
from django.db import models

#Question模型
class Question(models.Model):
    question_text = models.CharField(max_length=200)  #问题描述字段,字段长度200
    pub_date = models.DateTimeField('date published')  #发布日期字段,Date格式


#Choice模型
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)  #与Question设置联系,id主键。使用 ForeignKey 定义了一个关系。这将告诉 Django,每个 Choice 对象都关联到一个 Question 对象。
    choice_text = models.CharField(max_length=200)  #选项名称字段,字段长度200
    votes = models.IntegerField(default=0)  #投票数,默认值为0

 

激活模型

通过models.py的代码,django可以

  • 为这个应用创建数据库 schema(生成 CREATE TABLE 语句)。
  • 创建可以与 QuestionChoice 对象进行交互的 Python 数据库 API。

polls 应用安装到项目

Django 应用是“可插拔”的。你可以在多个项目中使用同一个应用。

在配置类 INSTALLED_APPS 中添加设置

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # PollsConfig 类写在文件 polls/apps.py 中,所以它的点式路径是 'polls.apps.PollsConfig'。
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

 

#通过运行 makemigrations 命令,Django 会检测你对模型文件的修改(在这种情况下,你已经取得了新的),并且把修改的部分储存为一次 迁移。
python manage.py makemigrations polls
#迁移命令会执行哪些 SQL 语句
python manage.py sqlmigrate polls 0001
#在数据库里创建新定义的模型的数据表
python manage.py migrate

迁移是非常强大的功能,它能让你在开发过程中持续的改变数据库结构而不需要重新删除和创建表 - 它专注于使数据库平滑升级而不会丢失数据。

改变模型三步走:

  1. 编辑 models.py 文件,改变模型。、
  2. 运行 python manage.py makemigrations 为模型的改变生成迁移文件。
  3. 运行 python manage.py migrate 来应用数据库迁移。

 

API

#打开python命令行
python manage.py shell
#导入Quesiton和Choice模型
>>>from polls.models import Choice, Question

#查看Question模型的所有实例
>>>Question.objects.all()
<QuerySet []>   #目前为空

#导入时区timezone模块
>>>from django.utils import timezone

#创建一个Question对象
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

#保存Question对象到数据库
>>>q.save()

#显示Question对象q的ID
>>>q.id
1

#显示Question对象q的属性
>>>q.question_text
"What's new?"
>>>q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

#改变q的question_text的值
>>>q.quextion_text="What's up?"
>>>q.save()

#显示数据库中所有的Question对象
>>>Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

__str__()

<Question: Question object (1)> 对于我们了解这个对象的细节没什么帮助。

QuestionChoice 增加 __str__() 方法,

polls/models.py

from django.db import models

class Question(models.Model):
    # ...
    def __str__(self):
        return self.question_text  #Question.objects.all()显示qwuestion_text

class Choice(models.Model):
    # ...
    def __str__(self):
        return self.choice_text

 

在模型里添加自定义方法

polls/models.py

import datetime

from django.db import models
from django.utils import timezone


class Question(models.Model):
    # ...

    #自定义方法,最近发布的Question
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

打开shell,

>>>from polls.models import Choice, Question

#验证__str()__是否起作用
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

#Django提供数据库lookup API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>

>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

#筛选pub_date
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

#通过主键pk进行lookup
>>> Question.objects.get(pk=1)
<Question: What's up?>

#确保自定义的方法生效
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

#显示q所有的choice
>>> q.choice_set.all()
<QuerySet []>

#通过get显示指定Question的choice_set
>>> Question.objects.get(pk=1).choice_set.all()
<QuerySet [<Choice: Not much >, <Choice: sky >, <Choice: Just hacking again>]>
>>> Question.objects.get(pk=2).choice_set.all()
<QuerySet []>

#通过filter显示指定Question的choice_set
#filter返回的是一个集合,需要指定其中的一个成员后使用choice_set.all()
>>> Question.objects.filter(id=1)[0].choice_set.all()
<QuerySet [<Choice: Not much >, <Choice: sky >, <Choice: Just hacking again>]>
>>> Question.objects.filter(id=2)[0].choice_set.all()
<QuerySet []>


#创建选项
>>> 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的对象c的API能够访问与之关联的Question对象
>>>c.question
<Question: What's up?>

#显示指定question对象的choice集合
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

#显示指定question对象的choice的数目
>>> q.choice_set.count()
3


>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

#删除指定的choice
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章