Django 的数据库操作
Django 的数据库操作
有之前的基础,那么我们就可以开始对数据库进行操作。
一、数据库配置
配置 MySql
在主目录的 settings.py
中修改
1 | DATABASES = { |
数据库驱动
'django.db.backends.sqlite3'
:SQLite嵌入式数据库。'django.db.backends.postgresql'
:BSD许可证下发行的开源关系型数据库产品。'django.db.backends.mysql'
:转手多次目前属于甲骨文公司的经济高效的数据库产品。'django.db.backends.oracle'
:甲骨文公司的关系型数据库旗舰产品。
如果你没有安装数据库依赖还需要:
1 | (venv)$ pip install pymysql |
然后在项目目录的__init__.py
:中对数据库驱动初始化。
从而避免Django找不到连接MySQL的客户端工具而询问你:“Did you install mysqlclient? ”
1 | import pymysql |
创建模型构建数据表
创建一个app应用
1
(venv)$ python manage.py startapp user
将应用注册到项目中去
1
2
3
4
5
6
7
8
9
10# 在项目目录中的 settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
]注册路由跳转
1
2
3
4
5
6
7
8# 项目目录中的 urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('user.urls')),
]构建数据模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# 应用目录的 models.py
from django.db import models
class User(models.Model):
"""用户类"""
no = models.IntegerField(primary_key=True, db_column='no', verbose_name='编号')
name = models.IntegerField(db_column='name', verbose_name='名字')
gender = models.CharField(max_length=20, db_column='gender', verbose_name='性别')
age = models.CharField(max_length=20, db_column='age', verbose_name='年龄')
address = models.CharField(max_length=20, db_column='address', verbose_name='籍贯')
qq = models.IntegerField(db_column='qq', verbose_name='QQ')
email = models.CharField(max_length=20, db_column='email', verbose_name='邮箱')
class Meta:
db_table = 'user'
class Admin(models.Model):
"""管理员"""
no = models.IntegerField(primary_key=True, db_column='no', verbose_name='编号')
username = models.CharField(max_length=20, db_column='username', verbose_name='用户名')
password = models.CharField(max_length=20, db_column='password', verbose_name='密码')
class Meta:
db_table = 'manager'生成数据表
1
2
3
4
5
6# 迁移 Django 内置的管理数据表
(venv)$ python manage.py migrate
# 生成我们的数据迁移文件
(venv)$ python manage.py makemigrations user
# 迁移我们的数据表
(venv)$ python manage.py migrate可以看出除了最后两张表,上面都是Django为我们默认配置的数据表
二、登录 Django 的后台管理系统
Django框架有自带的后台管理系统来实现对模型的管理。虽然实际应用中,这个后台可能并不能满足我们的需求,但是在学习Django框架时,我们暂时可以利用Django自带的后台管理系统来管理我们的模型,同时也可以了解一个项目的后台管理系统到底需要哪些功能。
注册一个超级管理员账号
1 | (venv)$ python manage.py createsuperuser |
然后我们启动 Django
1 | (venv)$ python manage.py runserver |
访问 http://127.0.0.1:8000/admin
输入刚刚注册的账号密码就可以用 Django 提供的图形界面来操作我们的数据库了
这里会记录我们对数据库的所有操作
三、模型定义参考
字段
对字段名称的限制
- 字段名不能是Python的保留字,否则会导致语法错误
- 字段名不能有多个连续下划线,否则影响ORM查询操作
Django模型字段类
字段类 | 说明 |
---|---|
AutoField | 自增ID字段 |
BigIntegerField | 64位有符号整数 |
BinaryField | 存储二进制数据的字段,对应Python的bytes类型 |
BooleanField | 存储True或False |
CharField | 长度较小的字符串 |
DateField | 存储日期,有auto_now和auto_now_add属性 |
DateTimeField | 存储日期和日期,两个附加属性同上 |
DecimalField | 存储固定精度小数,有max_digits(有效位数)和decimal_places(小数点后面)两个必要的参数 |
DurationField | 存储时间跨度 |
EmailField | 与CharField相同,可以用EmailValidator验证 |
FileField | 文件上传字段 |
FloatField | 存储浮点数 |
ImageField | 其他同FileFiled,要验证上传的是不是有效图像 |
IntegerField | 存储32位有符号整数。 |
GenericIPAddressField | 存储IPv4或IPv6地址 |
NullBooleanField | 存储True、False或null值 |
PositiveIntegerField | 存储无符号整数(只能存储正数) |
SlugField | 存储slug(简短标注) |
SmallIntegerField | 存储16位有符号整数 |
TextField | 存储数据量较大的文本 |
TimeField | 存储时间 |
URLField | 存储URL的CharField |
UUIDField | 存储全局唯一标识符 |
字段属性
通用字段属性
选项 | 说明 |
---|---|
null | 数据库中对应的字段是否允许为NULL,默认为False |
blank | 后台模型管理验证数据时,是否允许为NULL,默认为False |
choices | 设定字段的选项,各元组中的第一个值是设置在模型上的值,第二值是人类可读的值 |
db_column | 字段对应到数据库表中的列名,未指定时直接使用字段的名称 |
db_index | 设置为True时将在该字段创建索引 |
db_tablespace | 为有索引的字段设置使用的表空间,默认为DEFAULT_INDEX_TABLESPACE |
default | 字段的默认值 |
editable | 字段在后台模型管理或ModelForm中是否显示,默认为True |
error_messages | 设定字段抛出异常时的默认消息的字典,其中的键包括null、blank、invalid、invalid_choice、unique和unique_for_date |
help_text | 表单小组件旁边显示的额外的帮助文本。 |
primary_key | 将字段指定为模型的主键,未指定时会自动添加AutoField用于主键,只读。 |
unique | 设置为True时,表中字段的值必须是唯一的 |
verbose_name | 字段在后台模型管理显示的名称,未指定时使用字段的名称 |
ForeignKey属性
- limit_choices_to:值是一个Q对象或返回一个Q对象,用于限制后台显示哪些对象。
- related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为
'+'
,或者以'+'
结尾。 - to_field:指定关联的字段,默认关联对象的主键字段。
- db_constraint:是否为外键创建约束,默认值为True。
- on_delete:外键关联的对象被删除时对应的动作,可取的值包括django.db.models中定义的:
- CASCADE:级联删除。
- PROTECT:抛出ProtectedError异常,阻止删除引用的对象。
- SET_NULL:把外键设置为null,当null属性被设置为True时才能这么做。
- SET_DEFAULT:把外键设置为默认值,提供了默认值才能这么做。
ManyToManyField属性
- symmetrical:是否建立对称的多对多关系。
- through:指定维持多对多关系的中间表的Django模型。
- throughfields:定义了中间模型时可以指定建立多对多关系的字段。
- db_table:指定维持多对多关系的中间表的表名。
模型元数据选项
选项 | 说明 |
---|---|
abstract | 设置为True时模型是抽象父类 |
app_label | 如果定义模型的应用不在INSTALLED_APPS中可以用该属性指定 |
db_table | 模型使用的数据表名称 |
db_tablespace | 模型使用的数据表空间 |
default_related_name | 关联对象回指这个模型时默认使用的名称,默认为 |
get_latest_by | 模型中可排序字段的名称。 |
managed | 设置为True时,Django在迁移中创建数据表并在执行flush管理命令时把表移除 |
order_with_respect_to | 标记对象为可排序的 |
ordering | 对象的默认排序 |
permissions | 创建对象时写入权限表的额外权限 |
default_permissions | 默认为('add', 'change', 'delete') |
unique_together | 设定组合在一起时必须独一无二的字段名 |
index_together | 设定一起建立索引的多个字段名 |
verbose_name | 为对象设定人类可读的名称 |
verbose_name_plural | 设定对象的复数名称 |
查询参考
按字段查找可以用的条件:
- exact / iexact:精确匹配/忽略大小写的精确匹配查询
- contains / icontains / startswith / istartswith / endswith / iendswith:基于
like
的模糊查询 - in:集合运算
- gt / gte / lt / lte:大于/大于等于/小于/小于等于关系运算
- range:指定范围查询(SQL中的
between…and…
) - year / month / day / week_day / hour / minute / second:查询时间日期
- isnull:查询空值(True)或非空值(False)
- search:基于全文索引的全文检索
- regex / iregex:基于正则表达式的模糊匹配查询
四、静态页面映射
我们将我们的实现准备好的 html 文件反正根目录的 templates 文件夹里面,再创建一个 static 文件夹来存放我们的 js、css、font之类的资源文件。最后配置我们的资源映射
1 | # 在项目目录的 settings.py |
在 html 中引入资源文件
1 | <!-- 在最前面加载静态文件 --> |
五、基本增删改查语句
1 | from user import models |
下面是 Django框架的一些基本查询 API 整理
1 | all(): 查询所有结果 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Fabian Bao!
评论