概述
要真正有意义的展示出数据,不能仅仅从静态页面获取信息,而是需要跟后端的数据库进行交互,例如从url拿到一个检索关键词,通过post/get请求从后端数据库检索到相应的信息后,再通过前端渲染展示出来。当然这仅仅是一个非常简单而常见的要求,总的来说数据库的增删查改都是以后需要用到的。
Django自带数据库sqlite3,可以直接使用,以此为例来展示上述过程,其他的数据库例如MySQL可以据此修改相应设置即可。
初始化sqlite3
Django在创建项目的时候自动创建一个db.sqlite3
的数据库文件,可以在vscode通过sqliteviewer插件查看,可以看到是空表
- 初始化数据库
python.exe .\manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial… OK
Applying auth.0001_initial… OK
Applying admin.0001_initial… OK
Applying admin.0002_logentry_remove_auto_add… OK
Applying admin.0003_logentry_add_action_flag_choices… OK
Applying contenttypes.0002_remove_content_type_name… OK
Applying auth.0002_alter_permission_name_max_length… OK
Applying auth.0003_alter_user_email_max_length… OK
Applying auth.0004_alter_user_username_opts… OK
Applying auth.0005_alter_user_last_login_null… OK
Applying auth.0006_require_contenttypes_0002… OK
Applying auth.0007_alter_validators_add_error_messages… OK
Applying auth.0008_alter_user_username_max_length… OK
Applying auth.0009_alter_user_last_name_max_length… OK
Applying auth.0010_alter_group_name_max_length… OK
Applying auth.0011_update_proxy_permissions… OK
Applying sessions.0001_initial… OK
再次查看,已经生成了相应的初始化表了
真正创建一个数据库表
Django中创建一个数据库非常简单,只需要通过django.db.models.Model
生成相应的类即可,这个类即是一个表,类的属性即对应着表格的字段,类的方法则对应着表格的增删查改。以往不得不通过底层数据库的sql语句变成直接面向对象(ORM,object realated model)的属性和方法定义,即可直接操作整个表。好处在于,无需考虑不同数据库语法,在改变其他数据库类型的时候只需要改一些配置,无需更改代码。整体步骤:
- 1.创建相应的app
- 2.在app中的models.py中定义数据表的类
- 3.在settings.py的INSTALL_APPS中添加该应用的数据库类配置名称
- 4.执行
python manage.py makemigrations app
以及python manage.py migrate app
同步数据库 - 语法:
from django.db import models
class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
定义一个类其实就是一个数据表,每个类的objective就是一个数据行
models.py:
from django.db import models
# Create your models here.
# 定义一个名为Students的类
class Students(models.Model): # 该类必须继承models.Model
name = models.CharField(max_length=100, null=True) # 字符字段,最大长度,允许空值
age = models.IntegerField(null=True) # 整数字段
sex = models.CharField(max_length=10, null=True)
height = models.FloatField(max_length=10, null=True) # 浮点字段
weight = models.FloatField(null=True, blank=True) # 允许为空值,不用填,否则该项必须填
settings.py:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'students.apps.StudentsConfig', # 添加的数据库类,来自于students app下的apps文件中的StudentsConfig类
]
students app-apps.py是自动生成的,只需要将StudentsConfig
类添加到上面的设置文件中即可
from django.apps import AppConfig
class StudentsConfig(AppConfig):
name = 'students'
在执行上述两条迁移命令后,刷新数据库,可以看到,已经添加了一个名为students_students
的表(改名称是students app名加上models中的类名组成)
- 常用字段选项
verbose_name:表头名称,每个字段最终在网页显示的表头名称
primary_key:如果指定为Ture则该字段为主键,不在创建id
blank:如果为True则允许该字段为空,不需要一定填写
default:给予默认值,例如default=8
以及其他选项(可查阅django文档)
例如,创建一个字符串字段,要求长度限制30,不能为空,必须唯一,必须有索引
name = CharField(max_length=30, null=False, unique=True, db_index=True)
登记自定义表格,便于后台显示管理
- 创建一个系统管理账户
依次输入用户名、邮箱(可用来找回密码)以及密码
python.exe .\manage.py createsuperuser
Username (leave blank to use 'yut'):
Email address: 123@qq.com
Password:
Password (again):
This password is too common.
This password is entirely numeric.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
我们可以看到对应的数据库表格新增了1个记录,包括用户名、密码等信息。我们可以通过默认的admin
路由登录
我们可以看到,之前创建的StudentsDB表并未出现在admin页面,如何添加呢?只需要登记一下即可。在students app的admin.py中
from django.contrib import admin
from .models import StudentsDB # 导入自定义表格的类
# Register your models here.
admin.site.register(StudentsDB) # 登记该表格,便于在后台显示
然后刷新管理页面,即可看到新增的表
点击该表,可以看到目前为空
点击add则可以看到之前定义好的字段
- 前面定义好的字段如果
blank = True
则该字段可以为空比用填,否则该字段必须有值
字段类型及注意
类型 | 注意 |
---|---|
BooleanField | 布尔型,True/False |
CharField | 字符串,必须设置max_length |
IntegerField | 整型 |
FloatField | 浮点型 |
DateField | 日期,参数3个,只能选一个,auto_now = True:每次保存对象时使用当前日期;auto_now_add = True:创建该对象日期;default:设置当前时间,例如‘2022-02-02‘ |
DateTimeField | 同上,但是更加精确到秒 |
DecimalField | 2个必须参数,可以生成010.00格式的数字,max_digits:总位数,包括小数后的位数;decimal_places :小数点后的位数 |
EmailField | 邮箱类型,包括@等符号检查 |
ImageField | 保存图片存储路径 |
TextField | 不定长文本 |
更改数据表名称
由于django默认是应用+类来命名数据表的,可以通过Meta
类来更改
student.views.py
from django.models import models
class student(model.Model):
name = CharField(max_length=10)
class Meta: #固定写法
db_table = 'Stuents' # 将原来的student_student表名变成Students
常见问题及解决
- 1.执行
python manage.py makemigrations
时出现some field without default
,原因在于新增字段时,原有数据不知道该如何赋值
解决方法:选择2)在model.py中给字段添加一个选项default=xxx
- 2.数据库迁移混乱
解决方法:删除migrations目录下所有0000?xxx.py(__init__.py除外)
,再执行迁移数据库命令