Django学习2:数据库

版权声明:本文real_Rickys原创文章,未经real_Rickys允许不得转载。 https://blog.csdn.net/real_Rickys/article/details/82661799

Django学习2:

 作为一个后台开发框架,必不可少的需要用到数据库的链接。Django几乎支持所有的主流数据库。我选择使用mysql作为我的数据库来配置。

step1:配置mysql

 首先需要配置所需要的数据库类型,默认是sqllite,不过这个东西只是一个内嵌的测试数据库,所以需要改变默认的配置。在mysite/setting.py中有一个database{default:{}}动西,这就是配置数据库的配置区。
 由于使用了mysql,为了链接数据库和python,我们需要使用一个dbdriver,我使用了推荐的mysqlclient。
 注意这里需要安装mysqlclient可以到如下网站https://www.lfd.uci.edu/~gohlke/pythonlibs/# 。找到对应版本而不是直接用pip,因为pip安装的时候会找不到文件,需要精确定位版本。

 我的具体配置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase_Django',
        'USER': 'root',
        'PASSWORD': 'rootroot',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

 注意端口配置3306等靠前的端口否则可能会链接失败。

step2:设置Time Zone及installed apps

 在windows下服务的时区需要手动设置,所以在配置文件改变time_zone的内容:

TIME_ZONE = 'Asia/Shanghai'

&emps;django必须要知道那些应用他可以使用,所以需要配置installed_apps这个参数,这里保持默认值就可以。这些应用都需要数据库的支持,所以要生成一些数据库table来容纳,Django提供了如下代码自动生成表格:

python manage.py migrate

step3:creating modles

 这里的modles就是要用到的数据库里的数据以及对这些数据的操作。
 学习的例子也就是这个polls系统需要用到两个modles:一个是question,也就是用来放置为题;还有一个是choice就是用来保存投票选项及计数器。
 我们需要打开polls/models.py文件输入如下代码:

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)

 代码中的类皆是jango.db.models.Model的子类,类中有数个变量带表了这个类的数据域也就是model的数据域。在这其中如CharField 就代表了字符型数据,DateTimeField 就是date型数据。
 ”date_published”是一个pub_date的别名,在field的第一个位置参数可选的可以给当前的变量名取一个容易分辨的名字,来作为Django中可以使用的名字同时兼作文档中的名字。
 有些数据域类型需要定义参数如 CharField 中的”max_length“,这是为数据库提供标准,同时也可以用在校验中。
 同时在Django中也可以设置外键如这里Choice类中的question,Django支持多对多,一对多,一对一这些关系。

step4:activating models

 定义了上述的modles后django就可以在数据库中为这个app建立表格,以及创建api来访问这连个modles。
 首先我们需要做的是将这个app plug进入整个项目中,如同上面step2中的方法,我们在intalled_app添加这个app。我们发现PollsConfig这个类在polls/apps.py中,所以在/mysite/setting.py的installed_apps的setting中加入如下代码:

'polls.apps.PollsConfig',

 而后在命令行中运行以下命令来创建models:

python manage.py makemigrations polls

 见到以下的结果就算成功:
这里写图片描述
 这行命令makemigrations是表明对项目进行了修改。而结果中的0001_initial.py是一个改变的可读文档。可以使用下面的命令来查看到底有那些sql语句是Django认为需要的:

python manage.py sqlmigrate polls 0001

 具体的sql语句取决于你的database。而后使用如下语句来创建tables。

python manage.py migrate

 需要注意的是Django是自动来同步数据库,也就是不用手动进入数据库来改变table的结构。所以目前用以下3个步骤即可:

  1. step1:在modles.py中改变modles
  2. step2:使用python manage.py makemigrations 来为改变的地方创建migrations
  3. step3:使用python manage.py migrate 将改变同步到数据库

step5:API的使用

 python会给项目提供一些api这些api可以通过python shell使用,使用如下代码可以进入python shell:

python manage.py shell

 有别与普通的python来调用shell,这个python的shell是带着Django环境的(不知道pycharm中为什么跑不起来)。在shell中使用如下代码来了解api的使用:

>>> from polls.models import Choice, Question  # Import the model classes we just wrote.

# 查看Quesion的数据
>>> Question.objects.all()
#结果为:<QuerySet []>表示当前无数据

# 创建一个Question表的条目:

>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())

# 将这行数据保存进入数据库
>>> q.save()

# 查看数据的id
>>> q.id
1

#查看数据的question_text字段和pub_date字段
>>> q.question_text
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)

#可以直接在python中修改字段然后将修改应用到数据库
>>> q.question_text = "What's up?"
>>> q.save()

>>> Question.objects.all()
<QuerySet [<Question: Question object (1)>]>

 我们可以看到最后结果”QuerySet [< Question: Question object (1)>]” 不是特别清楚,可以在polls/models.py中给两个类分别加上一个__str()__ 方法:


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

 当然我们也可以添加一个自定义方法,在polls/models.py中更新如下代码:

import datetime

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


class Question(models.Model):
    # ...
    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

 这里的timedelta()表示的是datetime.date-datetime.date后的值,这里就是表示是否这个数据是在一天内创建的。完成后更新这些修改然后重新打开shell进行测试:

>>> from polls.models import Choice, Question

# 验证一下__str()__的有效性
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

#Django可以通过各种关键字来查询数据
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

# 查出今年发布的问题,注意下划线的个数
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 如果查询一个id不存在的数据,会报出错误
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

#由于通过主键查找数据非常的常见,所以可以通过以下方式来通过主键获取数据
>>> Question.objects.get(pk=1)
<Question: What's up?>

# 测试一下刚才自定义的方法
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# 还可以查询其作为choice类的外键所关联的有几个choice
>>> q.choice_set.all()
<QuerySet []>

# 创建三个choice
>>> 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类也可以查询到其外键属于哪个Question
>>> c.question
<Question: What's up?>

>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> 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()

 需要注意get和filter的区别,django的get是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错。django的filter方法是从数据库的取得匹配的结果,返回一个对象列表,如果记录不存在的话,它会返回[]。

step6:ADMIN页面

 Django有一套成熟和简便的方法来生成ADMIN页面。他是标准化的统一界面来管理整个站点。
 首先我们先生成一个admin user,输入下列命令:

py manage.py createsuperuser

 而后会提示输入用户名,邮箱和密码,输入完成后就创建好了用户。

username:admin
Email address:admin@example.com
password:123456

 而后连上runserver,进入127.0.0.1:8000/admin页面

py manage.py runserver

 注意有可能会因为任何一个urls.py中,urlspattern={} 这样的格式导致页面错误出现Django admin argument to reversed() must be a sequence。
 输入密码登陆进入这个页面后,会发现没有自己写的app,这就需要告诉admin Question是有admin接口的,打开polls/admin输入以下内容:

from django.contrib import admin
from .models import Question
# Register your models here.

admin.site.register(Question)

 这样就可以发现polls被添加进入了页面中并且还有Question的子项。

猜你喜欢

转载自blog.csdn.net/real_Rickys/article/details/82661799
今日推荐