当前位置: 首页 > news >正文

[Django ]Django 的数据库操作

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 pymysql

pymysql.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, include
    
    urlpatterns = [
        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 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'
     
  • 生成数据表

    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字段
BigIntegerField64位有符号整数
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 models

def 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 许可协议。转载请注明来自 丁生的个人博客!

相关文章:

  • 【boost】Windows下VS2017下boost库安装配置
  • 【mySQL】C++操作mySql数据库(Mysql connector c++)
  • [多线程]多线程编程需要注意的问题|多进程
  • 【开发者手册】开发者手册
  • 【C++11】C++11 多线程编程
  • 【多线程】c++11多线程编程(一)——初识
  • 【C++11】C++11 中的std::function和std::bind
  • 【多线程】c++11多线程编程(二)——理解线程类的构造函数
  • 【函数式编程】什么是函数式编程? C语言为何不是函数式语言?
  • 【多线程】c++11多线程编程(三)——竞争条件与互斥锁
  • 【多线程】c++11多线程编程(四)——死锁(Dead Lock)
  • 【多线程】c++11多线程编程(六)——条件变量(Condition Variable)
  • 【多线程】c++11多线程编程(五)——unique_lock和lock_guard
  • 【C/C++】内存和字符操作整理
  • 【知识】如何高效地在github上找开源项目学习?
  • 2017 年终总结 —— 在路上
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • python3 使用 asyncio 代替线程
  • Redux系列x:源码分析
  • vue 个人积累(使用工具,组件)
  • Vue.js-Day01
  • vue--为什么data属性必须是一个函数
  • 阿里云应用高可用服务公测发布
  • 初识 webpack
  • 关于List、List?、ListObject的区别
  • 记录:CentOS7.2配置LNMP环境记录
  • 技术:超级实用的电脑小技巧
  • 人脸识别最新开发经验demo
  • 三分钟教你同步 Visual Studio Code 设置
  • 少走弯路,给Java 1~5 年程序员的建议
  • 十年未变!安全,谁之责?(下)
  • 微信开放平台全网发布【失败】的几点排查方法
  • 我的zsh配置, 2019最新方案
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 阿里云服务器购买完整流程
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (03)光刻——半导体电路的绘制
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (循环依赖问题)学习spring的第九天
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)树状数组
  • ******之网络***——物理***
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .gitignore文件_Git:.gitignore
  • .net Application的目录
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [Angular] 笔记 16:模板驱动表单 - 选择框与选项
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [LeetCode][138]【学习日记】深拷贝带有随机指针的链表