1. 程式人生 > >Django中ORM表的建立和增刪改查方法示例

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] 的使用者