zoukankan      html  css  js  c++  java
  • Django ORM基本用法

    一、ORM介绍

    1.ORM的概念:

     "对象-关系映射"(Object/Relational Mapping) 的缩写。ORM 把数据库映射成对象,然后通过实例对象完成对关系型数据库的操作,如下图。

    2.ORM的特点

     ORM 使用了对象进行数据库操作,开发者无需了解 sql 语法,只要面向对象编程即可,直接与数据交互,不用关心底层数据库。

    3.ORM 的优点

    1)实现了面向对象编程,无需面向数据库编码。

    • 对数据库的操作(如:增、删、改、查)转化成 类属性和方法
    • 不用编写各种 sql 语句

    2)实现了数据模型与数据库解耦,消除了不同数据库编码之间的差异。

    • 不用关心数据库是 mysql、Oracle、mssql等
    • 只要更改相关配置,就能完成不同数据库间的迁移

    4.ORM 的缺点

    1)对比直接使用 sql 语句查询,性能有损失。

    2)ORM 库不是一个轻量级库,学习成本高。

    3)相对于较复杂的 sql 语句,使用 ORM 来操作很复杂,导致代码可读性降低。

     

    二、ORM 使用

     1.配置数据库

    1)修改 Django 项目 setting.py ,找到 DATABASES 配置

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',  # 数据库引擎
            'NAME': 'work',  # 数据库名称
            'HOST': '127.0.0.1',  # 数据库地址,本机 ip 地址 127.0.0.1
            'PORT': 3306,  # 端口
            'USER': 'root',  # 数据库用户名
            'PASSWORD': '123456',  # 数据库密码
        }
    }

    2)修改 setting.py 同级目录下的 __init__.py 文件,增加如下代码。

    import pymysql
    
    pymysql.version_info = (1,3,13,'final',0)  # 一定要加上这句代码
    pymysql.install_as_MySQLdb()

     pymysql.version_info = (1,3,13,'final',0) 指定版本信息,不然后续会报如下错误 mysqlclient 1.3.13 or newer is required; you have 0.9.3

    2.数据模型

    1)定义 app 中的 models:例如修改 core/models.py

    from django.db import models
    # Create your models here.
    
    
    class department_temp(models.Model):
        id = models.AutoField(primary_key=True)
        jobnum = models.CharField(max_length=100)
        department = models.CharField(max_length=100)
        jirakey = models.CharField(max_length=100)
        name = models.CharField(max_length=100)
    
        class Meta:  # 必须要写这个类
            db_table = 'department_temp'  # 指定表名
    • 以类名 department_temp 对应数据库表名,继承了models.Model 类。jobnum 对应 字段 jobnum,数据类型 CharField 对应 varchar,max_length 限定长度。
    • class Meta 是一个元类,通过 db_table  指定表名

    2)基本操作

    from core.models import department_temp
    
    # 增加一条数据
    test = department_temp(jobnum = '00000001',department = 'test',jirakey = '02930213',name = 'test')
    test.save()
    View Code

    from core.models import department_temp
    
    # 删除
    test = department_temp.objects.get(jobnum = '00000001')
    test.delete()
    
    # 另外一种方式
    # department_temp.objects.filter(jobnum = '00000001').delete()
    
    # 删除所有的列
    # department_temp.objects.all().delete()
    View Code

    from core.models import department_temp
    
    # 修改其中一个字段,再save,相当于SQL中的UPDATE
    test = department_temp.objects.get(jobnum = '00000001')
    test.name = '亚瑟'
    test.save()
    
    # 另外一种方式
    # department_temp.objects.filter(jobnum = '00000001').update(name='李白')
    
    # 修改所有的列
    # department_temp.objects.all().update(name='李白')
    View Code

    from core.models import department_temp
    
    # 获取单个对象
    test =department_temp.objects.get(jobnum = '00000001')
    print(test.name)
    
    # filter相当于SQL中的WHERE,可设置条件过滤结果,返回一个或多个实例对象组成的QuerySets查询集
    # test = department_temp.objects.filter(jobnum = '00000001')[0]
    
    # 数据排序,返回QuerySets查询集
    # test = department_temp.objects.order_by('id')[0]
    
    # 限制返回的数据 相当于 SQL 中的 LIMIT 0,2;返回QuerySets查询集
    # test = department_temp.objects.order_by('id')[0:2]
    
    # 可以组合使用查询条件,返回QuerySets查询集
    # test = department_temp.objects.filter(jobnum = '00000001').order_by('id')
    
    # 查询所有,返回QuerySets查询集
    # test = department_temp.objects.all()
    View Code

    3)进阶操作

    # test = department_temp.objects.filter(name='亚瑟').count()  # 获取个数
    
    # 大于,小于
    # test = department_temp.objects.filter(id__gt=1)              # 获取id大于1的值
    # test = department_temp.objects.filter(id__gte=1)              # 获取id大于等于1的值
    # test = department_temp.objects.filter(id__lt=10)             # 获取id小于10的值
    # test = department_temp.objects.filter(id__lte=10)             # 获取id小于10的值
    # test = department_temp.objects.filter(id__lt=10, id__gt=1)   # 获取id大于1 且 小于10的值
    
    # in
    # test = department_temp.objects.filter(id__in=[11, 22, 33])   # 获取id等于11、22、33的数据
    # test = department_temp.objects.exclude(id__in=[11, 22, 33])  # not in
    
    # isnull
    # test = department_temp.objects.filter(jobnum__isnull=True)
    
    # contains
    # test = department_temp.objects.filter(name__contains="test")
    # test = department_temp.objects.filter(name__icontains="test") # icontains大小写不敏感
    # test = department_temp.objects.exclude(name__icontains="test")
    
    # range
    # test = department_temp.objects.filter(id__range=[1, 2])   # 范围bettwen and
    
    # order by
    # test = department_temp.objects.filter(name='亚瑟').order_by('id')    # asc
    # test = department_temp.objects.filter(name='亚瑟').order_by('-id')   # desc
    
    # group by
    # 实现这句包含group by 的 sql: SELECT department, COUNT(id) FROM department_temp GROUP BY department
    # from django.db.models import Count, Min, Max, Sum
    # test = department_temp.objects.values('department').annotate(Count('id'))
    
    # limit 、offset
    # test = department_temp.objects.all()[10:20]
    View Code
  • 相关阅读:
    [转]使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger
    [转]ASP.NET Core配置环境变量和启动设置
    [转]ASP.NET Core 指定环境发布(hosting environment)
    [转]COPY OR MOVE FILES AND FOLDERS USING OLE AUTOMATION
    [转]How to Use xp_dirtree to List All Files in a Folder
    [转]How to nest transactions nicely
    [转]Using TRY...CATCH in Transact-SQL
    [转][C#] 对List<T>取交集、连集及差集
    [转]Pass a ViewBag instance to a HiddenFor field in Razor
    Apache Ignite简介以及Ignite和Coherence、Gemfire、Redis等的比较
  • 原文地址:https://www.cnblogs.com/shenh/p/13279900.html
Copyright © 2011-2022 走看看