Django二(MySQL数据库)

来源:互联网 发布:采集卡监控软件 编辑:程序博客网 时间:2024/06/05 21:51

Django模型

  在Web应用中,主观逻辑经常涉及到和数据库进行交互。以数据库驱动网站在后台连接数据库服务器,从中取出一些数据,然后在Web页面用漂亮的格式展示这些数据。这个网站也可能会向访问者提供修改数据库的方法,许多复杂的网站都提供了以上两个功能的某种结合。

    对于我们的例子:发布会签到系统来说,也是以数据管理为主的网站,数据库表的设计完成就相当于Web系统已经完成一半,可见数据库表的设计难度,以及在Web开发中的重要性。

1)设计系统表

  Django提供完善的模型(model)层主要用来创建和存取数据,不需要我们直接对数据库进行操作;

  DJango模型基础知识:

      每个模型是一个Python类,继承django.db.models.model类,该模型的每个属性表示一个数据库表字段。所有这一切已经自动帮我们生成了数据库访问API ;

打开/sign/models.py 创建表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from django.db import models
 
# Create your models here.
 
#发布会表
 
class Event(models.Model):
    name        = models.CharField(max_length=100)        #发布会标题
    limit       = models.IntegerField()                         #参加人数
    status      = models.BooleanField()                           #状态
    address     = models.CharField(max_length=200)        #地址
    start_time  = models.DateTimeField('events time')      #发布会时间
    create_time = models.DateTimeField(auto_now=True)    #创建时间(自动获取当前时间)
 
    def __str__(self): #将对象以str的方式显示出来
        return self.name
 
#嘉宾表
class  Guest(models.Model):
    event = models.ForeignKey(Event)                               #关联发布会id
    realname = models.CharField(max_length=64)           #姓名
    phone    = models.CharField(max_length=16)             #手机号
    email    = models.EmailField()                                       #邮箱
    sign     = models.BooleanField()                                    #签到状态
 
    create_time = models.DateTimeField(auto_now=True)     #创建时间(自动获取当前时间)
 
    class Meta:
        unique_together = ("event","phone")     #联合主键,id+手机号来做为联合主键
 
    def __str__(self):                                              #将对象以str的方式显示出来
        return self.realname

 PS:对于产品发布会来说,是一个事件。时间、地点、人物等要素必不可少,在设计数据库表的时候需要围绕着这些要素进行。

         关于发布会表(Event类) 和 嘉宾表(Guest类)的每一个字段,在代码中已经做了注释,有些字段的设计需要做一下简单的说明。

         首先:发布会表和嘉宾表中默认都会生成自增id,而我们在创建模型时不需要声明该字段。

         其次:发布会表中增加了status字段用于表示发布会的状态是否开启,用于控制该发布会是否可用。

         紧接:嘉宾表中通过event_id关联发布会表,一条嘉宾信息一定属于某一场发布会。

         最后:对于一场发布会来说,一般会选择手机号作为一个嘉宾的验证信息,所以对于一场发布会来说,手机号必须是唯一,除了嘉宾id外,这里提供发布会id+手机号来做为联合主键。

         __str__()方法告诉Python如何将对象以str的方式显示出来,所以为每个模型类添加了__str__()方法。

 Django数据类型:

 

 

 进行数据库迁移

cmd.exe

..guest>python manage.py makemigrations sign

..guest>python manage.py migrate

 2) admin后台管理

   通过Admin后台管理创建的【发布会和嘉宾表】

.../sign/admin.py

1
2
3
4
5
from django.contrib import admin
from sign.models import Event,Guest
# Register your models here.
admin.site.register(Event)
admin.site.register(Guest)

  登录admin后台:http://127.0.0.1:8001/admin/

 点击【Add】添加一条发布会(Event)数据

PS:只显示了发布会名称,如何才能显示表中更多字段?

修改 admin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from django.contrib import admin
from sign.models import Event,Guest
# Register your models here.
 
class EventAdmin(admin.ModelAdmin):
#EventAdmin类继承django.contrib.admin.ModelAdmin类,保存一个类的自定义配置,这里选择自定义list_display是字段名称列表,
#用于定义要在列表中显示那些字段,当然这些字段必须是在模型Event()类定义
 
    list_display = ['name','status','start_time','id']
 
class GuestAdmin(admin.ModelAdmin):
    list_display = ['realname','phone','email','sign','create_time','event']
 
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)

 保存代码后,重新刷新Event列表

接下来,点击Add添加一条嘉宾(Guest)数据:

 

3)生成搜索栏和过滤器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from django.contrib import admin
from sign.models import Event,Guest
# Register your models here.
 
class EventAdmin(admin.ModelAdmin):
#EventAdmin类继承django.contrib.admin.ModelAdmin类,保存一个类的自定义配置,这里选择自定义list_display是字段名称列表,
#用于定义要在列表中显示那些字段,当然这些字段必须是在模型Event()类定义
 
    list_display  = ['name','status','start_time','id']
 
    search_fields = ['name']   #搜索栏
    list_filter   = ['status'#过滤器
 
class GuestAdmin(admin.ModelAdmin):
    list_display = ['realname','phone','email','sign','create_time','event']
 
    search_fields = ['realname','phone'#搜索栏,search_fields用于创建表字段的搜索器,可以设置搜索关键字匹配多个表字段
    list_filter   = ['sign']             #过滤器list_filter用于创建字段过滤器
 
admin.site.register(Event,EventAdmin)
admin.site.register(Guest,GuestAdmin)

 查看Event列表与Guest列表

PS: search_fields用于创建表字段的搜索器,可以设置搜索关键字匹配多个表字段。

      list_filter用于创建字段过滤器。

4)SQLite管理工具

  可视化的SQL工具可以方便管理数据库,两种常用的SQLite管理工具:

  4.1)SQLiteManager

    Firefox浏览器插件库中搜索SQLiteManager ,打开Firefox浏览器菜单栏--->工具--->附加组件--->搜索SQLiteManager安装,并重启浏览器--->菜单栏【工具】下拉菜单中选择SQLiteManager ;

  4.2)SQLiteStudio

    SQLiteStudio是一款SQLite数据库可视化工具,是使用SQLite数据库开发应用的必备软件,无需安装下载解压即可使用。

下载地址:https://sqlitestudio.pl/index.rvt?act=download

 4.3)配置MySQL

      前面用的数据库是Python自带的SQLite3,这种数据库并不适用大型的项目,Django还支持一下几种数据库:

  • PostgreSQL   (http://www.postgresql.org/)
  • MySQL           (http://www.mysql.com/)
  • Oracle            (http://www.oracle.com/)

已MySQL为例:

  下载MySQL:http://dev.mysql.com/downloads/mysql/

进入mysql

  在Windows命令提示符下进入MySQL

cmd.exe

  c:\Users>mysql -u root -p

  Enter  password: ********

登录用户名为root,密码在安装过程中设置,如果没有填写默认为空

mysql基本操作

查看库与表:

#查看当前数据库下面的所有库:

mysql>show databases; 

 

mysql> use test;  #切换到test库

mysql> show tables; #查看test库下面的表

 

查看mysql端口号:

mysql> show global variables like 'port' ;

创建数据库:

mysql> CREATE DATABASE guest CHARACTER SET utf8;

 

  4.4)、安装PyMySQL

cmd.exe

 4.5)、Django配置MySQL

 ../guest/settings.py 文件中修改数据库相关配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
WSGI_APPLICATION = 'guest.wsgi.application'
 
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
#
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }
 
DATABASES = {
    'default': {
        'ENGINE':'django.db.backends.mysql',
        'HOST'  :'127.0.0.1',
        'PORT'  :'3306',
        'NAME'  :'guest',
        'USER'  :'tian',
        'PASSWORD':'123456',
        'OPTIONS':{
            'init_command':"SET sql_mode='STRICT_TRANS_TABLES'",
        },
 
    }
}

 PS: 1、注释原来的DATABASES,重新添加;

          2、配置信息从上到下依次驱动(ENGINE),主机地址(HOST),端口号(PORT),数据库(NAME),登录用户名(USER),登录密码(PASSWORD)

 注意:切换数据库后,之前Sqlite3数据库里的数据并不能复制到MySQL中,所有需要重新进行数据库同步,使数据模型重新在MySQL数据库中生成表。

cmd.exe

 D:\Py_django\guest>python manage.py migrate

  报错了,这是因为Django在连接MySQL数据库时默认使用的是MySqldb驱动,然而我们没有安装该驱动,因为它并不支持Python3,我们现在安装的是PyMySQL驱动,如何让当前的Django通过PyMySQL来连接MySQL数据库?

在 /guest/__init_.py目录下添加:

__init__.py

1
2
3
import pymysql
 
pymysql.install_as_MySQLdb()

 重新执行数据库同步

 另外,因为更换了数据库,所以Admin后台超级管理员账号(admin)也需要重新创建

cmd.exe

1
2
3
4
5
6
D:\Py_django\guest>python manage.py createsuperus
Username (leave blank to use 'administrator'): ad
Email address: admin@mail.com
Password:
Password (again):
Superuser created successfully.

 4.6)MySQL管理工具

MySQL的管理工具很多,与IED工具的选择医院,根据个人习惯选择。最常用的应该是Navicat了,Navicat是一个很强大的MySQL数据库管理和开发工具。

 

另外一个数据库管理工具SQLyog

 

原创粉丝点击