Django中ORM表的建立和增刪改查方法示例
Django中ORM表的建立和增刪改查方法示例
Django作為重量級的Python web框架,在做專案時肯定少不了與資料庫打交道,程式設計人員對資料庫的語法簡單的還行,但過多的資料庫語句不是程式設計人員的重點物件。因此用ORM來操作資料庫相當快捷。今天來介紹一下用ORM操作資料庫。
一、建立Django專案
可以使用pycharme專業版直接快速建立。如果不是專業版也可以使用命令進行建立。下面列出命令列建立方式:
django-admin startproject orm_test
這時會在當前目錄建立資料夾名為orm_test,接下來進入orm_test資料夾中,執行命令:
python manage.py runserver
就啟動了該專案,預設瀏覽器訪問127.0.0.1:8000就可以看到專案執行成功的提示。
接下來我們用命令在專案中建立一個應用:
django-admin startapp cmdb
此時基本準備就做好了。
二、修改配置檔案
把我們的應用即cmdb新增到 setting.py 的 INSTALLED_APPS 中:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'cmdb', #我們建立的應用 ]
另外我們基本用的是mysql資料庫,但django中預設為sqlite3。仍然在setting.py中找到 DATABASES ,對內容進行修改:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm_test', #資料庫名稱 'USER':'root', #使用者 'PASSWORD':'123456', #密碼 'HOST':'localhost', #IP地址,本地測試為localhost 'PORT':'3306', #埠號 } }
裡面的“NAME”的值是你資料庫中已有的資料庫名稱,接下里在此資料庫中建立資料表。
在python3 中,連線資料庫的是pymysql,因此在專案同名資料夾下的__init__.py 中加入以下程式碼才能正常執行。
import pymysql pymysql.install_as_MySQLdb()
三、寫模板檔案來建立表結構
在應用(cmdb)的 models.py 中開始寫表結構,我們要做的就是寫一個類,類中的屬性為表中的列,ORM將類轉換為sql語句。簡單的寫一個下面的類,包含使用者名稱和密碼兩列。
from django.db import models
Create your models here.
class users(models.Model):
username=models.CharField(max_length=32)
password=models.CharField(max_length=64)
四、生成資料表
在終端中輸入命令列 python manage.py makemigrations ,這時會在應用(cmdb)下的migrations資料夾下出現一個_initial.py 的檔案,它記錄著生成資料表結構的一些資料的臨時檔案,接著在命令列中輸入 python manage.py migrate,由剛才的臨時檔案生成資料表。我們在資料庫中檢視生成的資料表,可以看到django生成的不僅僅是剛建立的一個表,而是十多個表,除自己的一張表,剩餘為django內部使用(包含有快取,cookie,session等,畢竟這麼厲害的框架為你做到你想不到的是應該的)。在終端中檢視一下表結構:show create table cmdb_users;
看到的不僅有兩個自定的屬性列,多出一個id列,並且是自增的還是主鍵。
五、路由對映關係
在同名專案資料夾下的urls.py 中匯入應用(cmdb),寫對映關係到cmdb的views.py
from django.conf.urls import url from django.contrib import admin from cmdb import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), ]
六、檢視及資料表的增刪改查
在路由對映到應用(cmdb)下的views.py 中,右對映中寫對應的函式,也就是login函式。用於顯示的觀察專案的執行,我們在此函式中就先簡單得的列印到螢幕上一句“Hello World”。
在login函式中寫入增刪改查的語句。
from django.shortcuts import render from django.shortcuts import HttpResponse # Create your views here.
from cmdb import models
def login(request):
#增加
models.users.objects.create(username=‘xsmile’,password=12345)
models.users.objects.create(username=‘sofia’,password=12345)
models.users.objects.create(username=‘jerry’,password=12345)
#檢視
result=models.users.objects.all() #檢視所有
條件查詢,結果為querySet型別,所以迴圈取出結果
result=models.users.objects.filter(username=‘sofia’)
for row in result:
print(row.id,row.username,row.password)
#更改
models.users.objects.filter(id=2).update(username=‘eric’)
#刪除
#models.users.objects.filter(username=‘sofia’).delete()
return HttpResponse(‘Hello World’)
啟動專案後,瀏覽器訪問127.0.0.1:8000/login 就可看到螢幕上的Hello World,表示相關的資料操作已成功修改資料表。
相關操作後資料表內容的變化如下:
#插入一條資料後
mysql> select * from cmdb_users;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | xsmile | 12345 |
+----+----------+----------+
1 row in set (0.00 sec)
#再插入三條資料後
mysql> select * from cmdb_users;
±—±---------±---------+
| id | username | password |
±—±---------±---------+
| 1 | xsmile | 12345 |
| 2 | xsmile | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
±—±---------±---------+
4 rows in set (0.00 sec)
#修改資料後
mysql> select * from cmdb_users;
±—±---------±---------+
| id | username | password |
±—±---------±---------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 3 | sofia | 12345 |
| 4 | jerry | 12345 |
±—±---------±---------+
4 rows in set (0.00 sec)
#刪除資料後
mysql> select * from cmdb_users;
±—±---------±---------+
| id | username | password |
±—±---------±---------+
| 1 | xsmile | 12345 |
| 2 | eric | 12345 |
| 4 | jerry | 12345 |
±—±---------±---------+
3 rows in set (0.00 sec)
七、django orm 常用查詢篩選
先列舉一下django orm中的常用查詢的篩選方法:
- 大於、大於等於
- 小於、小於等於
- in
- like
- is null / is not null
- 不等於/不包含於
model:
class User(AbstractBaseUser, PermissionsMixin): uuid = ShortUUIDField(unique=True) username = models.CharField(max_length=100, db_index=True, unique=True, default='') schoolid = models.CharField(max_length=100, null=True, blank=True, default='') classid = models.CharField(max_length=100, null=True, blank=True, default='') fullname = models.CharField(max_length=50, default='', null=True, blank=True) email = models.EmailField(_('email address'), blank=True, null=True) age = models.SmallIntegerField(default=0)
大於、大於等於
__gt 大於 __gte 大於等於
User.objects.filter(age__gt=10) // 查詢年齡大於10歲的使用者
User.objects.filter(age__gte=10) // 查詢年齡大於等於10歲的使用者
小於、小於等於
__lt 小於 __lte 小於等於
User.objects.filter(age__lt=10) // 查詢年齡小於10歲的使用者
User.objects.filter(age__lte=10) // 查詢年齡小於等於10歲的使用者
in
__in
查詢年齡在某一範圍的使用者
User.objects.filter(age__in=[10, 20, 30])
like
__exact 精確等於 like 'aaa'
__iexact 精確等於 忽略大小寫 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含 忽略大小寫 ilike '%aaa%',但是對於sqlite來說,contains的作用效果等同於icontains。
is null / is not null
__isnull 判空
User.objects.filter(username__isnull=True) // 查詢使用者名稱為空的使用者
User.objects.filter(username__isnull=False) // 查詢使用者名稱不為空的使用者
不等於/不包含於
User.objects.filter().excute(age=10) // 查詢年齡不為10的使用者 User.objects.filter().excute(age__in=[10, 20]) // 查詢年齡不為在 [10, 20] 的使用者