django--ORM入門到精通


一,Django ORM 與原生SQL對比

ORM:  
  優勢:
    1.簡單,不用本身SQL語句
    2.開發效率高
  缺點:
    1.記憶你這個特殊的語法
    2. 相對於大神的SQL語句,確定執行效率有差距
  


2、ORM的對應關係

ORM的對應關係:
    類        --->    數據表
    對象      --->    數據行
    屬性      --->    字段


3、ORM能作的事兒

ORM能作的事兒:
    1.操做數據表    --->    建立表、刪除表、修改表
    2.操做數據行    --->    數據的增、刪、改、查
    
    注意事項:不能建立數據庫、本身動手建立數據庫

4、本身動手手動建立數據庫

1. 修改django項目中settings.py 中數據庫鏈接類型:
html

create database dbs11;


2. 在Django項目中設置鏈接數據庫的相關配置(告訴Django鏈接哪個數據庫)
前端

#數據庫相關配置
DATABASES = {
    'default':{
        #鏈接的數據庫類型
        'ENGINE':'django.db.backends.mysql',
        #鏈接數據庫的地址
        'HOST':'127.0.0.1',
        #數據庫端口
        'PORT':3306,
        #鏈接數據庫的名稱
        'NAME':"dbs11",
        #鏈接數據庫的用戶名
        'USER':'root',
        #鏈接數據庫的密碼
        'PASSWORD':'123456'
    }
}


3.告訴Django用pymysql代替默認的MySQLDB 鏈接MySQL數據庫python

    在項目目錄中__init__.py文件中導入MySQL鏈接配置文件
mysql

import pymysql

#告訴Django用pymysql來代替默認的MySQLdb
pymysql.install_as_MySQLdb()


4.在項目如(app)下面的models.py 文件中定義一個類,這個類必須繼承models.Modelweb

from django.db import models

#ORM相關的只能寫在這個文件裏,寫到別的文件裏Django找不到
##例如:

class UserInfo(models,Model):
    id = models.AutoField(primary_key=True)    #建立一個自增的主鍵字段
    name = models.CharField(null=False,max_length=16)    #建立一個varchar類型的字段不能爲空


5.執行兩個命令sql

python3 manage.py makemigrations
python3 manage.py migrate


說明:以上爲經過ORM建立數據庫,若是是刪除或者修改只須要在models.py文件中刪除相關字段而後執行第5步的兩個命令便可刪除字段。修改一樣只須要修改models.py文件而後執行第5步的兩個命令便可。數據庫


5、經過ORM操做數據庫

ORM查詢django

示例:ORM查詢全部用戶後端

#orm查詢語法:models.表名.objects.all()   #查詢全部
###
ret = models.UserInfo.objects.all()
print(ret[0].id,ret[0].name)

在django項目中應用操做:
併發

後端執行方法:

from django.shortcuts import HttpResponse, render, redirect
from app import models

def user_list(request):
    #去數據庫中查詢全部的用戶
    #利用ORM這個工具去查詢數據庫,不用本身去查詢
    ret = models.UserInfo.objects.all()
    
    # 打開user_list.html文件,
    return render(request, "user_list.html", {"user_list": ret})

前端HTML

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>用戶列表頁</title>
</head>
<body>

<a href="/add_user/">添加用戶</a>

<table border="1">
    <thead>
    <tr>
        <th>id值</th>
        <th>用戶名</th>
    </tr>
    </thead>
    <tbody>

    {% for user in user_list %}
        <tr>
        <td>{{ user.id }}</td>
        <td>{{ user.name }}</td>
        </tr>
    {% endfor %}

    </tbody>
</table>
</body>
</html>

路由urls.py配置:

from app import views  #導入項目

urlpatterns = [
    url(r'^user_list/',views.user_list)  #定義對應路徑關係
]


ORM添加

#orm添加語法:models.表名.objects.create(name=new_name)  #ORM添加

示例:ORM添加用戶

models.UserInfo.objects.create(name=new_name)

路由urls.py配置:

from app import views  #導入項目

urlpatterns = [
    url(r'^user_list/',views.user_list),  #定義對應路徑關係
    url(r'^user_add/',views.user_add),
    
]

後端執行方法:

def user_add(request):
    if request.method == "POST":
        #用戶填寫新的用戶名,併發送POST請求
        new_name = request.POST.get('username',None)
        #去數據庫中建立一條用戶記錄
        models.UserInfo.objects.create(name=new_name)
        
        ##添加成功後返回展現網頁
        return redirect("/user_list/")
    
    #第一個請求頁面的時候,就返回一個頁面,頁面上有兩個框讓用戶填寫
    return render(request,"add_user.html")

前端執行的方法:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>添加用戶</title>
</head>
<body>

<form action="/add_user/" method="post">
    <p>用戶名:
        <input type="text" name="username">
    </p>
    
    <p>
        <input type="submit" value="提交">
    </p>
</form>

</body>
</html>


ORM與原生SQL查詢

#原生SQL 
#查詢全部
select * from user;

##ORM語法:
models.user.objects.all()

###ORM條件語句查詢

#filter條件(SQL:where)
models.user.objects.filter(id=1)

#條件大於 
##SQL: SELECT * from user where id>1 and password='123'
#ORM gte
models.user.objects.filter(id__gt=1,password='123')

#條件 like語法
##ORM 
models.user.objects.filter(password__startswith='a')    #以a開頭 .這裏對大小寫敏感,而SQL like不敏感

models.user.objects.fileter(username__icontains='a')    #對大寫不敏感的,即a,A都匹配

#SQL in 語句對比ORM語句
select ... where id in(1,2,3,4);

models.user.objects.filter(id__in=[1,2,3,4])

##ORM查詢日期
models.user.objects.filter(register_date_month=5)
models.user.objects.filter(register_date_month=5)[0].register_date
#對比SQL語句
select ... where extract('month' from pub_date) = '12';


##ORM批量建立用戶
#有100個建立對象
objs = [models.user(title='name{}'.format(i)) for i in range(100)]

models.user.objects.bulk_create(onjs,10)    #這裏是10個一提交,即每次建立10個用戶
相關文章
相關標籤/搜索