创建Django项目
django-admin startproject bookmanager
进入到bookmanager目录下运行
python manage.py runserver

创建子应用
python manage.py startapp book
注册子应用
使其与工程bookmanager建立联系

创建实体类
在book=>models里面
from django.db import models
# Create your models here.
class BookInfo (models.Model):
name = models.CharField(max_length=10)
class PeopleInfo (models.Model):
name = models.CharField(max_length=10)
gender = models.BooleanField() # 性别
book = models.ForeignKey(BookInfo , on_delete=models.CASCADE)
扩展:
class BookInfo (models.Model):
name = models.CharField(max_length=10,unique=True ,verbose_name='书籍名称') # unique:是否唯一
pub_date = models.DateField(null=True)
readcount = models.IntegerField(default=0)
commentcount = models.IntegerField(default=0)
is_delete = models.BooleanField(default=False)
class Meta:
db_table = 'bookinfo' #修改表的名字
verbose_name= '书籍管理' # admin站点的使用
def __str__(self):
return self.name
class PeopleInfo (models.Model):
GENDER_CHOICES=(
(1,'male'),
(2,'female')
)
name = models.CharField(max_length=10)
gender = models.SmallIntegerField(choices=GENDER_CHOICES,default=1) # 性别
description = models.CharField(max_length=200 ,null=True)
book = models.ForeignKey(BookInfo , on_delete=models.CASCADE)
is_delete = models.BooleanField(default=False)
class Meta:
db_table = 'peopleeinfo'
verbose_name = '人物关系'
def __str__(self):
return self.name
1) 数据库表名
模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。
可通过db_table指明数据库表名。
2) 关于主键
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
3) 属性命名限制
-
不能是python的保留关键字。
-
不允许使用连续的下划线,这是由django的查询方式决定的。
-
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)
4)字段类型
| 类型 | 说明 |
|---|---|
| AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性 |
| BooleanField | 布尔字段,值为True或False |
| NullBooleanField | 支持Null、True、False三种值 |
| CharField | 字符串,参数max_length表示最大字符个数 |
| TextField | 大文本字段,一般超过4000个字符时使用 |
| IntegerField | 整数 |
| DecimalField | 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数 |
| FloatField | 浮点数 |
| DateField | 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 |
| TimeField | 时间,参数同DateField |
| DateTimeField | 日期时间,参数同DateField |
| FileField | 上传文件字段 |
| ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
5) 选项
| 选项 | 说明 |
|---|---|
| null | 如果为True,表示允许为空,默认值是False |
| blank | 如果为True,则该字段允许为空白,默认值是False |
| db_column | 字段的名称,如果未指定,则使用属性的名称 |
| db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False |
| default | 默认 |
| primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用 |
| unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False |
null是数据库范畴的概念,blank是表单验证范畴的
6) 外键
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
- CASCADE级联,删除主表数据时连通一起删除外键表中数据
- PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
- SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
- SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
- **SET()**设置为特定值或者调用特定方法
- DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
模型迁移
#生成迁移文件
python manage.py makemigrations
#执行迁移
python manage.py migrate
表结构中就会有这两个类

站点管理
进入Django的管理界面

这个时候表中是没有管理员的账号密码,所以我们要创建
python .\manage.py createsuperuser


输入刚才创建的账号密码后进入后台管理页面
发现没有我们创建的BookInfo和PeopleInfo模型
在book==》admin.py文件中注册自定义的模型类
from book.models import BookInfo, PeopleInfo
# Register your models here.
admin.site.register([BookInfo, PeopleInfo])
重新启动并刷新页面

添加book信息
选择Add

添加之后发现不知道添加的类的内容
重新写模型的str类
class BookInfo (models.Model):
name = models.CharField(max_length=10)
def __str__(self):
return self.name
路由设置
我们想要通过一下地址访问页面
http://127.0.0.1:8000/index/
在views.py中定义页面
def index(request):
return HttpResponse("ok")
在urls.py中设置路由
from book.views import index
urlpatterns = [
path('admin/', admin.site.urls),
#定义的index路由
path('index/',index)
]
还有一种更加模块化的方法配置路由
先配置子应用的路由: 子应用中创建urls.py,定义路由
from django.urls import path
from book.views import index
urlpatterns = [
path('index/', index)
]
工程中映射
from django.contrib import admin
from django.urls import path,include
from book.views import index
urlpatterns = [
path('admin/', admin.site.urls),
#使用include
path('', include('book.urls'))
]
模版使用
1、创建index.html文件(路径在book/templates/book)
2、配置templates文件地址

3、渲染页面
def index(request):
#render表示渲染
return render(request,"book/index.html")
如果想要将返回的内容在页面中显示
def index(request):
# context是字典类型
context={
'title' : "你好"
}
return render(request,"book/index.html",context=context)
页面中使用{{}}获取数据
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="#">{{ title }}</a>
</body>
</html>
静态文件
创建static文件夹,并在里面放入可以访问的静态图片

配置静态文件地址
在setting.py中有个STATIC_URL (静态文件的访问路径),在其下方设置
STATICFILES_DIRS=[
os.path.join(BASE_DIR, 'book/static')
]

通过该地址进行访问
http://127.0.0.1:8000/static/python.png
App应用配置
在每个应用目录中都包含了apps.py文件,用于保存该应用的相关信息。
在创建应用时,Django会向apps.py文件中写入一个该应用的配置类,如
class BookConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'book' #表明加载到那个子应用
verbose_name ='图书管理' # 配置中文名
修改数据库为Mysql
将原来的sqlite的DATABASES替换成自己的mysql的
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 默认
'NAME': 'django',
'HOST': '127.0.0.1', # mysql的ip地址
'PORT': 3306, # mysql的端口
'USER': 'root',
'PASSWORD': 'root'
}
init.py_中写入
import pymysql
pymysql.install_as_MySQLdb()
如果没有安装pymysql,记得安装一下,命令:
pip install pymysql