Django 的数据库操作

有之前的基础,那么我们就可以开始对数据库进行操作。

一、数据库配置

配置 MySql

主目录的 settings.py 中修改

Python

1
2
3
4
5
6
7
8
9
10
 
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql',  # 数据库驱动'NAME': '', # 被操作数据库名称'HOST': '127.0.0.1', # 数据库位置'PORT': 3306, # 端口号'USER': '', # 用户名'PASSWORD': '',    # 密码}
}
 

数据库驱动

  • 'django.db.backends.sqlite3':SQLite嵌入式数据库。
  • 'django.db.backends.postgresql':BSD许可证下发行的开源关系型数据库产品。
  • 'django.db.backends.mysql':转手多次目前属于甲骨文公司的经济高效的数据库产品。
  • 'django.db.backends.oracle':甲骨文公司的关系型数据库旗舰产品。

如果你没有安装数据库依赖还需要:

Bash

1
 
(venv)$ pip install pymysql
 

然后在项目目录__init__.py:中对数据库驱动初始化。
从而避免Django找不到连接MySQL的客户端工具而询问你:“Did you install mysqlclient? ”

Python

1
2
3
 
import pymysqlpymysql.install_as_MySQLdb()
 

创建模型构建数据表

  • 创建一个app应用

    Bash

    1
     
    (venv)$ python manage.py startapp user
     
  • 将应用注册到项目中去

    Python

    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',
    ]
     
  • 注册路由跳转

    Python

    1
    2
    3
    4
    5
    6
    7
    8
     
    # 项目目录中的 urls.py
    from django.contrib import admin
    from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('user.urls')),
    ]
     
  • 构建数据模型

    Python

    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 modelsclass 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'
     
  • 生成数据表

    Bash

    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自带的后台管理系统来管理我们的模型,同时也可以了解一个项目的后台管理系统到底需要哪些功能。

注册一个超级管理员账号

Bash

1
2
3
4
5
6
 
(venv)$ python manage.py createsuperuser
Username :
Email address:
Password:
Password (again):
Superuser created successfully.
 

然后我们启动 Django

Bash

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属性

  1. limit_choices_to:值是一个Q对象或返回一个Q对象,用于限制后台显示哪些对象。

  2. related_name:用于获取关联对象的关联管理器对象(反向查询),如果不允许反向,该属性应该被设置为'+',或者以'+'结尾。

  3. to_field:指定关联的字段,默认关联对象的主键字段。

  4. db_constraint:是否为外键创建约束,默认值为True。

  5. on_delete:外键关联的对象被删除时对应的动作,可取的值包括django.db.models中定义的:

    • CASCADE:级联删除。
    • PROTECT:抛出ProtectedError异常,阻止删除引用的对象。
    • SET_NULL:把外键设置为null,当null属性被设置为True时才能这么做。
    • SET_DEFAULT:把外键设置为默认值,提供了默认值才能这么做。

    ManyToManyField属性

  6. symmetrical:是否建立对称的多对多关系。

  7. through:指定维持多对多关系的中间表的Django模型。

  8. throughfields:定义了中间模型时可以指定建立多对多关系的字段。

  9. db_table:指定维持多对多关系的中间表的表名。

模型元数据选项

选项 说明
abstract 设置为True时模型是抽象父类
app_label 如果定义模型的应用不在INSTALLED_APPS中可以用该属性指定
db_table 模型使用的数据表名称
db_tablespace 模型使用的数据表空间
default_related_name 关联对象回指这个模型时默认使用的名称,默认为_set
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 设定对象的复数名称

查询参考

按字段查找可以用的条件:

  1. exact / iexact:精确匹配/忽略大小写的精确匹配查询
  2. contains / icontains / startswith / istartswith / endswith / iendswith:基于like的模糊查询
  3. in:集合运算
  4. gt / gte / lt / lte:大于/大于等于/小于/小于等于关系运算
  5. range:指定范围查询(SQL中的between…and…)
  6. year / month / day / week_day / hour / minute / second:查询时间日期
  7. isnull:查询空值(True)或非空值(False)
  8. search:基于全文索引的全文检索
  9. regex / iregex:基于正则表达式的模糊匹配查询

四、静态页面映射

我们将我们的实现准备好的 html 文件反正根目录的 templates 文件夹里面,再创建一个 static 文件夹来存放我们的 js、css、font之类的资源文件。最后配置我们的资源映射

Bash

1
2
3
4
5
 
# 在项目目录的 settings.py
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),
]
 

在 html 中引入资源文件

Html

1
2
3
4
5
6
7
8
9
10
 
<!-- 在最前面加载静态文件 -->
{% load static %}<!-- 在html的head标签中 --><!-- 1. 导入CSS的全局样式 --><link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet"><!-- 2. jQuery导入 --><script src="{% static "js/jquery-2.1.0.min.js" %}"></script><!-- 3. 导入bootstrap的js文件 --><script src="{% static "js/bootstrap.min.js" %}"></script>
 

五、基本增删改查语句

Python

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
from user import modelsdef add(request):# 第一种方法:models.Admin.objects.create(username='userme', password='1234')# 第二种方法:添加数据,实例化表类,在实例化里传参为字段和值obj = models.Admin(username='userme', password='1234')# 写入数据库obj.save()# 第三种方法:将要写入的数据组合成字典,键为字段值为数据dic = {'username':'userme', 'password':'1234'}# 添加到数据库,注意字典变量名称一定要加**models.Admin.objects.create(**dic)def delete(request):# 删除数据models.Admin.objects.filter(username='userme').delete()def update(request):# 修改数据models.Admin.objects.filter(username='userme').update(username='admin')
 

下面是 Django框架的一些基本查询 API 整理

Yml

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
 
all(): 查询所有结果
filter(**kwargs): 它包含了与所给筛选条件相匹配的对象
get(**kwargs): 返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。
exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象
values(*field): 返回一个ValueQuerySet 一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
values_list(*field): 它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
order_by(*field): 对查询结果排序
reverse(): 对查询结果反向排序
distinct(): 从返回结果中剔除重复纪录
count(): 返回数据库中匹配查询(QuerySet)的对象数量。
first(): 返回第一条记录
last(): 返回最后一条记录
exists(): 如果QuerySet包含数据,就返回True,否则返回False
annotate(): 使用聚合函数
dates(): 根据日期获取查询集
datetimes(): 根据时间获取查询集
none(): 创建空的查询集
union(): 并集
intersection(): 交集
difference(): 差集
select_related(): 附带查询关联对象
prefetch_related(): 预先查询
extra(): 附加SQL查询
defer(): 不加载指定字段
only(): 只加载指定的字段
using(): 选择数据库
select_for_update(): 锁住选择的对象,直到事务结束。
raw(): 接收一个原始的SQL查询
 

文章作者: 丁生

文章链接: http://fabian4.gitee.io/55582.html

版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 丁生的个人博客!

[Django ]Django 的数据库操作相关推荐

  1. 关于Django中的数据库操作API之distinct去重的一个误传

    django提供的数据库操作API中的distinct()函数,了解SQL语句的读者都应该知道,DISTINCT关键字可以在select操作时去重.django里的这个distinct()函数也是这个 ...

  2. Django模型之数据库操作-查询

    六.数据库操作-查询 6.1基础条件查询 1 基本查询 get查询单一结果,如果不存在会抛出模型类.DoesNotExist异常. all查询多个结果.[返回的所有结果是列表] count查询结果数量 ...

  3. Django模型和数据库操作

    文本参考菜鸟教程,创建模型和数据库,并对mysql数据库进行操作. 1.创建数据库 在mysql命令行,输入创建数据库语句. create database runoob default charse ...

  4. Django框架之数据库操作

    文章目录 一.前言 二.数据库配置 三.数据表创建 1.单表创建 2.关联表创建 四.ORM增删改查 1.新增数据(C) (1)创建单表数据 (2)创建从表数据 2.读取数据(R) (1)读取多条数据 ...

  5. Django框架——模型(数据库操作)

    -- models.py -- ORM(object-relation mapping) 实现数据模型与数据库的解耦: # 对象,关系,映射: 1.根 据对象的类型生成表结构: 2.将对象.列表的操作 ...

  6. Django连接mysql数据库操作

    Y12 1.创建工程 django-admin startproject django_3 2.创建app python manage.py startapp app1 3.Mysql数据库配置  ( ...

  7. Django框架——ORM数据库操作

    目录 一.增加 二.删除 三.修改 四.查询 1.基本查询 2.过滤查询 3.过滤条件语法 4.F对象和Q对象 5.聚合函数 6.排序函数 7.关联查询 测试数据:BookInfo表 PeopleIn ...

  8. Django项目实践3 - Django模型(字段、数据库操作及模型继承)

    http://blog.csdn.net/pipisorry/article/details/45725953 Django数据库字段类型(Field types) AutoField class A ...

  9. Django与数据库操作

    Django与数据库操作 数据库连接的方法 web 框架 django --- 自己内部实现 (ORM) + pymysql(连接)Flask,tornado ---pymysqlSQLArchemy ...

  10. Django从理论到实战(part25)--数据库操作

    学习笔记,仅供参考 参考自:Django打造大型企业官网–Huang Y: 本系列Blog以应用为主,理论基础部分我在后端专栏的Django系列博客已经写过了,如果有些需要补充的知识点,我会在这个系列 ...

最新文章

  1. mysql 分区_搞懂MySQL分区
  2. Webpack 4 学习09(打包生成html)
  3. 绝学:用宏定义找BUG,了解一下?
  4. java开发学不会_JAVA学不会,快期末了,怎么办?
  5. python数据分析知识整理_Python基础知识点总结:数据分析从0到大师必Mark的一篇!(上)...
  6. 【从零开始】Python字符串的操作方法
  7. [NewLife.XCode]反向工程(自动建表建库大杀器)
  8. hadoop3 禁用ec_Hadoop + Amazon EC2 –更新的教程
  9. pyplot 余弦函数_python如何画出三角函数
  10. python图像边缘检测_使用python获取图像中形状的轮廓(x,y)坐标
  11. SAP License:ABC作业成本法-平行记帐
  12. 我是个初二学生,想考一中,现在该怎么努力?
  13. 纪念贴:历史会证明今天是不是开创新历史的一天
  14. (转载)vmware workstation14永久激活密钥分享
  15. 252个常见英语单词词根
  16. Java中通过js简单的调用高拍仪和扫描仪
  17. 解决python运行selenium程序执行完后,Chrome浏览器自动关闭的问题
  18. [转]音乐天堂 Music Heaven Vol.1 ~ Vol.36 的目录
  19. python练习项目八——下载所有XKCD 漫画
  20. LawBreaker: An Approach for Specifying Traffic Laws and Fuzzing Autonomous Vehicles (ASE2022)

热门文章

  1. 概率论:概率空间的基本概念
  2. java ready()_Java BufferedReader ready()用法及代码示例
  3. 计算机mac地址怎么修改密码,如何修改苹果电脑mac地址?
  4. FPGA实现DDRIP核配置(Memory Interface Solutions)
  5. Mac安装软件时各种异常情况的解决方法
  6. android打印动画,Android实用View系列------TextView实现打印机效果
  7. 关于Win10已设置默认打开方式的清除方法
  8. 实践致知第7享:Windows如何设置文件的默认打开方式?
  9. android录音笔记软件,录音笔记app
  10. 教父三部曲观后感总结