创建Django项目
创建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.nameclass 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的管理界面

Log in | Django site admin
这个时候表中是没有管理员的账号密码,所以我们要创建
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),#使用includepath('', 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 pymysqlpymysql.install_as_MySQLdb()
如果没有安装pymysql,记得安装一下,命令:
pip install pymysql
