django--ORM入門到精通


一,Django ORM 與原生SQL對比

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


二、ORM的對應關係

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


三、ORM能做的事兒

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

四、自己動手手動創建數據庫

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

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數據庫

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

import pymysql

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


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

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.執行兩個命令

python3 manage.py makemigrations
python3 manage.py migrate


說明:以上爲通過ORM創建數據庫,如果是刪除或者修改只需要在models.py文件中刪除相關字段然後執行第5步的兩個命令即可刪除字段。修改同樣只需要修改models.py文件然後執行第5步的兩個命令即可。


五、通過ORM操作數據庫

ORM查詢

示例: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個用戶


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章