django学习笔记(二)基本流程一


选择一个路径存放
进入所在路径 ,输入django-admin startproject project

一 、配置数据库

在project\project目录下
注意:django默认是sqlite

1、python3安装的是pymysql

2、在__init__.py文件中写入两行代码

import pymysql
pymysql.install_as_MySQLdb()

3、在settings.py中,通过DATABASES配置下面代码

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'sunck',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123456', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
    }
}

4、创建应用

  1. 在一个项目中可以创建多个应用,每个应用进行一种业务处理
  2. 打开黑屏终端进入D:\program\python3\Django_learning\project 目录下,输入tree . /F
    得到
卷 新加卷 的文件夹 PATH 列表
卷序列号为 087B-F38B
D:\PROGRAM\PYTHON3\DJANGO_LEARNING\PROJECT
│  manage.py
│
└─project
        asgi.py
        settings.py
        urls.py
        wsgi.py
        __init__.py
  1. 接下来输入python manage.py startapp firstapp回车
    遇到一下问题

File “C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\django-3.0.4-py3.7.egg\django\db\backends\mysql\base.py”, line 37, in
raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

在C:\Users\DELL\AppData\Local\Programs\Python\Python37\Lib\site-packages\Django-3.0.4-py3.7.egg\django\db\backends\mysql目录下找到base.py,将里面两行代码像我这样注释掉
在这里插入图片描述
继续输入python manage.py startapp firstapp回车,和下图一样则表示改成功了

在这里插入图片描述
在project目录下输入tree . /F,得到下图

│  manage.py
│
├─firstapp
│  │  admin.py
│  │  apps.py
│  │  models.py
│  │  tests.py
│  │  views.py
│  │  __init__.py
│  │
│  └─migrations
│          __init__.py
│
└─project
    │  asgi.py
    │  settings.py
    │  urls.py
    │  wsgi.py
    │  __init__.py
    │
    └─__pycache__
            settings.cpython-37.pyc
            urls.cpython-37.pyc
            __init__.cpython-37.pyc

4.firstapp目录说明

  • admin.py 站点配置
  • models.py 模型
  • views.py 视图

5、激活应用

在settings.py文件中,将firstapp应用加入到INSTALLED_APPS选项中

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'firstapp'#加入的应用名
]

6、定义模型

1、有一个数据表,就对应有一个模型
2、在models.py文件中定义模型,是为了与数据库进行一个交互
在firstapp文件下models.py中定义模型-------引入from django.db import models
--------模型类 要继承models.Model类
类里面的属性对应表里面的字段
3、在 models.py 中定义

from django.db import models
# Create your models here.

class Grades(models.Model):
    gname = models.CharField(max_length=20)
    gdate = models.DateTimeField()
    gnum  = models.IntegerField()#人数
    isDelete =models.BooleanField(default=False)#是否删除
    
class Students(models.Model):
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=False)#性别
    sage = models.IntegerField()#年龄
    scontend =models.CharField(max_length=20)#学生简介
    isDelete =models.BooleanField(default=False)#是否删除
    #关联外键
    sgrade = models.ForeignKey("Grades")
    

4、不需要定义主键,在生成时自动添加,并且值为自动增加的

7、在数据库中生成数据表

第一步生成迁移文件

在migrantions目录下生成一个迁移文件,此时数据库还没有生成数据表,可以在第一步结束之后,去sunck数据库下看看有没有数据表
1、(1)在project目录下,执行一个命令 python manage.py makemigrations
执行出错:

 File "D:\program\python3\Django_learning\project\firstapp\models.py", line 17, in Students
    sgrade = models.ForeignKey("Grades")
TypeError: __init__() missing 1 required positional argument: 'on_delete'

(2)修改代码:

定义外键的时候需要加上 on_delete=;

sgrade = models.ForeignKey("Grades",on_delete=models.CASCADE)

django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:

TypeError: init() missing 1 required positional argument: ‘on_delete’

由于多对多(ManyToManyField)没有 on_delete 参数,所以以上只针对外键(ForeignKey)和一对一(OneToOneField)

on_delete各个参数的含义如下:

 on_delete=None,               # 删除关联表中的数据时,当前表与其关联的field的行为
 on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除
 on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做
 on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError
 # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
 on_delete=models.SET_NULL,    # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
 # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
 on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
 on_delete=models.SET,         # 删除关联数据,
  a. 与之关联的值设置为指定值,设置:models.SET()
  b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

2、(1)在project目录下,执行一个命令
python manage.py makemigrations
出现警告:

C:\Users\DELL\AppData\Local\Programs\Python\Python37\lib\site-packages\pymysql\cursors.py:170: Warning: (3135, "'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.")
  result = self._query(query)
Migrations for 'firstapp':
  firstapp\migrations\0001_initial.py
    - Create model Grades
    - Create model Students

(2)修改配置(注意必须时英文状态下输入符号)
下面就是default_storage_engine=INNODB’附近粗错,可以检查符号

"You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',default_storage_engine=INNODB' at line 1")

django原来的连接数据库配置设置如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'sunck',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123456', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
        'OPTIONS':{'init_command':'SET sql_mode="STRICT_TRANS_TABLES",storage_engine=INNODB;'}  #设置数据库为INNODB,为第三方数据库登录用
            },
    }
}

修改后的代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':  'sunck',    #你的数据库名称
        'USER': 'root',   #你的数据库用户名
        'PASSWORD': '123456', #你的数据库密码
        'HOST': '', #你的数据库主机,留空默认为localhost
        'PORT': '3306', #你的数据库端口
        'OPTIONS': {
            'init_command': "SET sql_mode='traditional',default_storage_engine=INNODB;"#设置数据库为INNODB,为第三方数据库登录用
            },
    }
}

第二部执行迁移
1、(在project)在当前目录下执行python manage.py migrate
全是ok则执行成功
2、相当于执行sql语句,创建数据表(表明加上了项目)

mysql> desc firstapp_grades;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int         | NO   | PRI | NULL    | auto_increment |
| gname    | varchar(20) | NO   |     | NULL    |                |
| gdate    | datetime(6) | NO   |     | NULL    |                |
| gnum     | int         | NO   |     | NULL    |                |
| isDelete | tinyint(1)  | NO   |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
5 rows in set (0.06 sec)

mysql> desc firstapp_students;
+-----------+-------------+------+-----+---------+----------------+
| Field     | Type        | Null | Key | Default | Extra          |
+-----------+-------------+------+-----+---------+----------------+
| id        | int         | NO   | PRI | NULL    | auto_increment |
| sname     | varchar(20) | NO   |     | NULL    |                |
| sgender   | tinyint(1)  | NO   |     | NULL    |                |
| sage      | int         | NO   |     | NULL    |                |
| scontend  | varchar(20) | NO   |     | NULL    |                |
| isDelete  | tinyint(1)  | NO   |     | NULL    |                |
| sgrade_id | int         | NO   | MUL | NULL    |                |
+-----------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

8、测试数据操作

1、进入到python shell 环境,执行python manage.py shell

D:\program\python3\Django_learning\project>python manage.py shell
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

2、引入包

from firstapp.models import Grades,Students

from django.utils import timezone#django下面的一个工具包

from datetime import*

3、查询所有数据
查询班级表里有多少班级

#格式:类名.objects.all()
Grades.objects.all()#可以查到mysql班级表里所有的数据

Grades.objects.all()
<QuerySet []>#为空,没有数据

4、添加数据本质:创建一个模型类的对象实例

1、创建对象

grade1=Grades()#班级1,创建了一个空的
grade1.gname = "python04"
grade1.gdate = datetime(year=2017,month=7,day=17)
grade1.gnum=3

在数据库中select * from firstapp_grades;发现Empty set (0.00 sec)为空

在上面个的代码最后添加一个grade1.save(),就会把数据存在firstapp_grades中。对象调用save,就会存在数据库里面,是模型在和数据库交互,如下代码

注意:grade1(对象)里面除了最后的一个是否为空都必须定义数据否则会报错。

grade1=Grades()#班级1,创建了一个空的
grade1.gname = "python04"
grade1.gdate = datetime(year=2017,month=7,day=17)
grade1.gnum=3
grade1.save()

grade2=Grades()#班级2,创建了一个空的
grade1.gname = "python10"
grade1.gdate = datetime(year=2017,month=7,day=17)
grade1.gnum=6

2、去数据库中检查,数据插入成功

mysql> select * from firstapp_grades;
+----+----------+----------------------------+------+----------+
| id | gname    | gdate                      | gnum | isDelete |
+----+----------+----------------------------+------+----------+
|  1 | python04 | 2017-07-17 00:00:00.000000 |    3 |        0 |
|  2 | python10 | 2017-07-17 00:00:00.000000 |    6 |        0 |
+----+----------+----------------------------+------+----------+
1 row in set (0.00 sec)

Grades.objects.all()
<QuerySet [<Grades: Grades object (1)>]> #有了一条数据

5、查看某个对象
格式:>>>类名.objects.get(pk=2) #pk = primary key

Grades.objects.get(pk=2)

6、修改数据
通过模型修改数据库里面的数据
格式:>>>模型对象.属性=新值

grade2.gnum=60
grade2.save()#必须用这个要不然数据存不进去

7、删除数据
格式:>>>模型对象.delete()

grade2.delete()#grade2删除,物理删除,数据库中表里的数据被删除

8、关联对象, 外键
1、

grade1 = Grades.objects.get(pk=1)#主键
stu = Students()
stu.sname = "薛艳梅"
stu.sgender = False
stu.sage = 20
stu.scontend = "我叫薛艳梅"
stu.sgrade = grade1#外键
stu.save()

stu1=Students()
stu1.sname="刘德华"
stu1.sage=50
stu1.scontend="我叫刘德华"
stu1.sgrade = grade1#外键
stu1.save()

2、获得关联对象的集合
需求:获得python04班级的所有学生

格式:对象名.关联的类名小写_set.all
grade1.students_set.all()

3、需求:创建曾小贤,属于python04班级

sname=u"曾小贤",需要加u

可以不用save,直接添加到数据库中

stu3=grade1.students_set.create(sname=u"曾小贤",sgender=True,scontend=u"我叫曾小贤",sage=45)

9、启动服务器

1、格式:
在project目录下,该目录下有manage.py文件
(1)输入python manage.py runserver ip:port
(2)注意:ip可以不写,不写的话代表本机ip
(3)端口号默认是8000,可以修改
正常下:python manage.py runserver
2、说明
这是一个纯python写的轻量级web服务器,仅仅在开发测试中使用

10、代码跑起来

在cmd中,在project目录下,运行python manage.py runserver
需要启动mysql
http://127.0.0.1:8000/默认本地ip
在浏览器输入网址http://127.0.0.1:8000/,django服务已将打开了,正常想运行django,必须打开它的服务

猜你喜欢

转载自blog.csdn.net/ingenuou_/article/details/104884401