• 0基础跟我学python---Django(2)


    📢📢📢📣📣📣
    哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝
    一位上进心十足的【Java ToB端大厂领域博主】!😜😜😜
    喜欢java和python,平时比较懒,能用程序解决的坚决不手动解决😜😜😜

    ✨ 如果有对【java】感兴趣的【小可爱】,欢迎关注我

    ❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
    ————————————————

    如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。

    目录

    Django ORM简介

    数据库配置

    Django 如何使用 mysql 数据库

    定义模型

    创建 APP

    数据库操作

     添加数据

    ​编辑 更新数据

    删除数据


    今天我们学习一下Django的模型,

    Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。

    Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。

    MySQL 是 Web 应用中最常用的数据库。本章节我们将以 Mysql 作为实例进行介绍。你可以通过我的mysql教程,了解更多 MySQL 的基础知识。

    如果你没安装 mysql 驱动,可以执行以下命令安装:

    sudo pip3 install pymysql

    之前写过Sql-Alchemy的教程,有兴趣的小伙伴可以看一下,Sql-Alchemy同样是一个python的ORM框架,简单易学。

    0基础和我学python----SQLAlchemy框架(1)_奇点_97的博客-CSDN博客

    开始今天的正题吧。

    Django ORM简介

    Django 模型使用自带的 ORM。

    对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

    ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

    ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中

    一般来讲每一个模型对应到数据存储层面都对应一张表或者多张表。

    每一个模型的属性---对应的数据存储层都是对应一个表的字段。我们通过ORM就能将业务的模型和数据库中的存储信息建立映射关系了。

    ORM 把类映射成数据库中的表,把类的一个实例对象映射成数据库中的数据行,把类的属性映射成表中的字段,通过对象的操作对应到数据库表的操作,实现了对象到 SQL、SQL 到对象转换过程。

    Django 把表模型定义为 Model,他需要继承自django.db.models中的 Model 类,只要是与数据表相关的操作,都需要继承这个类。同时ORM 对于数据库的的增删改查,也提供了一些简单的 API,例如 F 查询、Q 查询。

    针对数据库中的字段类型,Django ORM 都有对应的 “xxxField” 来表述,见如下表格。

    字段说明字段属性
    AutoFiled默然自增主键(Primary_key=Ture),Django 默认建立id字段为主键。
    CharFiled字符类型Max_length=32,字符长度需要明确
    IntgerFiled整型 int
    DateFiled年月日时间类型auto_now=True,数据被更新就会更新时间 ;auto_now_add=True,数据第一次参数时产生。
    DateTimeFiled年月日小时分钟秒时间类型auto_now=True,数据被更新就会更新时间; auto_now_add=True,数据第一次参数时产生。
    DecimalFiled混合精度的小数类型max_digits=3,限定数字的最大位数(包含小数位);decimal_places=2,限制小数的最大位数。
    BooleanFiled布尔字段,对应数据库 tinyint 类型数据长度只有1位。值为True或False
    TextFiled用于大文本

    这里罗列出了大部分的数据类型,后续如果涉及到其他类型的再进行介绍。

    ORM框架的优缺点:

    优点缺点
    • 提高开发效率。
    • 不同数据库可以平滑切换。
    • ORM 代码转换为 SQL 语句时,需要花费一定的时间,执行效率会有所降低。
    • 长期写 ORM 代码,会降低编写 SQL 语句的能力。

    ORM的解析过程

    • 1、ORM 会将 Python 代码转成为 SQL 语句。
    • 2、SQL 语句通过 pymysql 传送到数据库服务端。
    • 3、在数据库中执行 SQL 语句并将结果返回。

    ORM中对象和sql数据库的对应关系 

    数据库配置

    Django 如何使用 mysql 数据库

    创建 MySQL 数据库( ORM 无法操作到数据库级别,只能操作到数据表)语法:

    create database 数据库名称 default charset=utf8; # 防止编码问题,指定为 utf8

    例如我们创建一个名为 test 数据库,编码指定为 utf8:
     

    create database test default charset=utf8;   

    我们在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

    1. DATABASES = {
    2. 'default':
    3. {
    4. 'ENGINE': 'django.db.backends.mysql', # 数据库引擎
    5. 'NAME': 'test', # 数据库名称
    6. 'HOST': '127.0.0.1', # 数据库地址,本机 ip 地址 127.0.0.1
    7. 'PORT': 3306, # 端口
    8. 'USER': 'root', # 数据库用户名
    9. 'PASSWORD': '123456', # 数据库密码
    10. }
    11. }

    如果你使用了 Python2.x 版本这里添加了中文注释,所以你需要在 HelloWorld/settings.py 文件头部添加 # -*- coding: UTF-8 -*-。

    上面包含数据库名称和用户的信息,它们与 MySQL 中对应数据库和用户的设置相同。Django 根据这一设置,与 MySQL 中相应的数据库和用户连接起来。

    接下来,告诉 Django 使用 pymysql 模块连接 mysql 数据库:

    1. # 在与 settings.py 同级目录下的 __init__.py 中引入模块和进行配置
    2. import pymysql
    3. pymysql.install_as_MySQLdb()

    定义模型

    其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类 ,它是由 django.db.models.Model 派生出的子类,在 Django 中模型类是数据交互的接口,一个模型类代表数据库中的一张数据表,模型类中每一个类属性都代表数据表中的一个字段。

    创建 APP

    Django 规定,如果要使用模型,必须要创建一个 app。我们使用以下命令创建一个 TestModel 的 app:

    django-admin startapp TestModel

    目录结构如下:

     我们修改 TestModel/models.py 文件,代码如下:

    1. # models.py
    2. from django.db import models
    3. class Test(models.Model):
    4. name = models.CharField(max_length=20)
    • 使用 from django.db import models 导入 models 模块;
    • 类名代表了数据库表名,且继承了models.Model
    • 类里面的字段代表数据表中的字段(name),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。

    一旦你定义了你的模型,你需要告诉 Django 你准备 使用 这些模型。你需要修改设置文件中的 INSTALLED_APPS ,在这个设置中添加包含 models.py 文件的模块名称。

    接下来在 settings.py 中找到INSTALLED_APPS这一项,如下:

    1. INSTALLED_APPS = (
    2. 'django.contrib.admin',
    3. 'django.contrib.auth',
    4. 'django.contrib.contenttypes',
    5. 'django.contrib.sessions',
    6. 'django.contrib.messages',
    7. 'django.contrib.staticfiles',
    8. 'TestModel', # 添加此项
    9. )

    在命令行中运行:

    1. $ python3 manage.py migrate # 创建表结构
    2. $ python3 manage.py makemigrations TestModel # 让 Django 知道我们在我们的模型有一些变更
    3. $ python3 manage.py migrate TestModel # 创建表结构

     

    看到几行 "Creating table…" 的字样,你的数据表就创建好了。

    表名组成结构为:应用名_类名(如:TestModel_test)。

    注意:尽管我们没有在 models 给表设置主键,但是 Django 会自动添加一个 id 作为主键。

    数据库操作

    接下来我们在 HelloWorld 目录中添加 testdb.py 文件(下面介绍),并修改 urls.py:

    1. from django.urls import path
    2. from TestModel import views,testdb
    3. # urlpatterns = [
    4. # path('admin/', admin.site.urls),
    5. # ]
    6. urlpatterns=[
    7. path('test/',views.test),
    8. path('testdb/',testdb.testdb) #路由到这个路径对应的文件
    9. ]

    文件下的方法 

     添加数据

    1. from django.http import HttpResponse
    2. from TestModel.models import Test
    3. # 数据库操作
    4. def testdb(request):
    5. test1 = Test(name='test')
    6. test1.save()
    7. return HttpResponse("

      数据添加成功!

      "
      )

     方法2:

    我们可以直接使用类名(即数据表名)来插入数据,下面是插入数据的一种方法:

    Test.objects.create(name='jay')

    读到这里,您可能会对“ objects ”产生疑问,所以在此处讲解一个重要的概念:每个继承自 models.Model 的模型类,都会有一个 objects 对象被同时继承下来,这个对象就叫做“管理器对象”,数据库的增删改查可以用 objects 管理器对象来实现。下面如果出现objects是同样的道理,就不再赘述。

    下面用objects写几个其他的CRUD的操作的🌰

    1. Test.objects.all()#查询表中的所有记录
    2. Test.objects.filter(name_contains='j')#查询表中name含有“j”的所有记录,被使用较多
    3. Test.objects.get(name="john")#有且只有一个查询结果,如果超出一个或者没有,则抛出异常
    4. Test.objects.get(name="john").delete()#删除名字为john的记录
    5. Test.objects.get(name="john").update(name='TOM')#更新数据表的name为TOM

    查询数据

    Django提供了多种方式来获取数据库的内容,如下代码所示:

    创建一个新的文件testdb1.py内容如下

    1. from django.http import HttpResponse
    2. from TestModel.models import Test
    3. # 数据库操作
    4. def testdb1(request):
    5. # 初始化
    6. response = ""
    7. response1 = ""
    8. # 通过objects这个模型管理器的all()获得所有数据行,相当于SQL中的SELECT * FROM
    9. list = Test.objects.all()
    10. # filter相当于SQL中的WHERE,可设置条件过滤结果
    11. response2 = Test.objects.filter(id=1)
    12. # 获取单个对象
    13. response3 = Test.objects.get(id=1)
    14. # 限制返回的数据 相当于 SQL 中的 OFFSET 0 LIMIT 2;
    15. Test.objects.order_by('name')[0:2]
    16. # 数据排序
    17. Test.objects.order_by("id")
    18. # 上面的方法可以组合使用
    19. Test.objects.filter(name="test").order_by("id")
    20. for var in list:
    21. response1 += var.name + " "
    22. response = response1
    23. return HttpResponse("

      " + response + "

      "
      )

    同时在urls.py中增加对应的映射路径

    1. urlpatterns = [
    2. path('test/', views.test),
    3. path('testdb/', testdb.testdb),
    4. path('testdb1/', TestModel.testdb1.testdb1),
    5. ]

    新添加一个数据

     更新数据

     在testdb1.py文件中添加一下更新代码的方法

    1. # 数据库操作
    2. def testdbupdate(request):
    3. """
    4. :param request:
    5. :return:
    6. """
    7. # 修改其中一个id=1的name字段,再save,相当于SQL中的UPDATE
    8. test1 = Test.objects.get(id=1)
    9. test1.name = 'Google'
    10. test1.save()
    11. # 另外一种方式
    12. # Test.objects.filter(id=1).update(name='Google')
    13. # 修改所有的列
    14. # Test.objects.all().update(name='Google')
    15. return HttpResponse("

      修改成功

      "
      )

    同时在urls.py中增加地址

    1. urlpatterns = [
    2. path('test/', views.test),
    3. path('testdb/', testdb.testdb),
    4. path('testdb1/', TestModel.testdb1.testdb1),
    5. path('testdbupdate/', TestModel.testdb1.testdbupdate),
    6. ]

    id是1的被修改成设定的值了

    删除数据

    删除数据库中的对象只需调用该对象的delete()方法即可:

    1. # 数据库操作
    2. def testdb_delete(request):
    3. # 删除id=1的数据
    4. test1 = Test.objects.get(id=2)
    5. test1.delete()
    6. # 另外一种方式
    7. # Test.objects.filter(id=1).delete()
    8. # 删除所有数据
    9. # Test.objects.all().delete()
    10. return HttpResponse("

      删除成功

      "
      )

     

     只剩下id是1的了。用Djang实现的ORM框架的最基本的简单操作就是这些了。

    注意:urls设置映射路径 和模块中对应的方法的映射关系

    Django实现数据库的操作还是非常简单的,相信待这里同学们就知道任何使用Django实现ORM操作了。稍休息一下,我们继续学习Django

    如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。 

  • 相关阅读:
    docker docker-compose 自定义网络 固定IP
    Scala基础
    vue知识点--vuex+映射
    Java---06 方法
    新库上线 | CnOpenData交通运输、仓储和邮政业工商注册企业基本信息数据
    【C++】哈希-bitset位图与模拟
    百度Mysql面试题总结
    算法_每日一题(9.7)
    Fushion 360齿轮组制作教程
    万界星空科技/生产制造管理MES系统/开源MES/免费MES
  • 原文地址:https://blog.csdn.net/qq_29235677/article/details/126470466