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

 

三、APP連接多個數據庫

 網上資料比較多的是多個APP對應多個數據庫,單個APP連接多個數據庫的資料比較少。下面介紹一種最簡單的方法:

 1. settings.py 配置多個數據庫

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',  # 數據庫密碼
    },
    'db1': {
        'ENGINE': 'django.db.backends.mysql',  # 數據庫引擎
        'NAME': 'test',  # 數據庫名稱
        'HOST': '127.0.0.1',  # 數據庫地址,本機 ip 地址 127.0.0.1
        'PORT': 3306,  # 端口
        'USER': 'root',  # 數據庫用戶名
        'PASSWORD': '123456',  # 數據庫密碼
    }
}

 

 2.調用時使用using指定數據庫,如果不指定數據庫,默認使用 default 

models.order.objects.using('db1').get(orderGuid='004afa44-7c7d-4f27-96eb-7063daba40a8').id

models.order.objects.using('db1').get(orderGuid='004afa44-7c7d-4f27-96eb-7063daba40a8').orderNumber

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM