这里写自定义目录标题
选择一个路径存放
进入所在路径 ,输入django-admin startproject project
一 、配置数据库
在projectproject目录下
注意: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、创建应用
- 在一个项目中可以创建多个应用,每个应用进行一种业务处理
- 打开黑屏终端进入D:programpython3Django_learningproject 目录下,输入tree . /F
得到
卷 新加卷 的文件夹 PATH 列表
卷序列号为 087B-F38B
D:PROGRAMPYTHON3DJANGO_LEARNINGPROJECT
│ manage.py
│
└─project
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
- 接下来输入python manage.py startapp firstapp回车
遇到一下问题
File “C:UsersDELLAppDataLocalProgramsPythonPython37libsite-packagesdjango-3.0.4-py3.7.eggdjangodbackendsmysqlase.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:UsersDELLAppDataLocalProgramsPythonPython37Libsite-packagesDjango-3.0.4-py3.7.eggdjangodbackendsmysql目录下找到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:programpython3Django_learningprojectfirstappmodels.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:UsersDELLAppDataLocalProgramsPythonPython37libsite-packagespymysqlcursors.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':
firstappmigrations 001_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:programpython3Django_learningproject>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,必须打开它的服务