Django中ORM表的創(chuàng)建和增刪改查方法示例
前言
Django作為重量級(jí)的Python web框架,在做項(xiàng)目時(shí)肯定少不了與數(shù)據(jù)庫(kù)打交道,編程人員對(duì)數(shù)據(jù)庫(kù)的語法簡(jiǎn)單的還行,但過多的數(shù)據(jù)庫(kù)語句不是編程人員的重點(diǎn)對(duì)象。因此用ORM來操作數(shù)據(jù)庫(kù)相當(dāng)快捷。今天來介紹一下用ORM操作數(shù)據(jù)庫(kù)。
一、創(chuàng)建Django項(xiàng)目
可以使用pycharme專業(yè)版直接快速創(chuàng)建。如果不是專業(yè)版也可以使用命令進(jìn)行創(chuàng)建。下面列出命令行創(chuàng)建方式:
django-admin startproject orm_test
這時(shí)會(huì)在當(dāng)前目錄創(chuàng)建文件夾名為orm_test,接下來進(jìn)入orm_test文件夾中,執(zhí)行命令:
python manage.py runserver
就啟動(dòng)了該項(xiàng)目,默認(rèn)瀏覽器訪問127.0.0.1:8000就可以看到項(xiàng)目運(yùn)行成功的提示。
接下來我們用命令在項(xiàng)目中創(chuàng)建一個(gè)應(yīng)用:
django-admin startapp cmdb
此時(shí)基本準(zhǔn)備就做好了。
二、修改配置文件
把我們的應(yīng)用即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', #我們創(chuàng)建的應(yīng)用 ]
另外我們基本用的是mysql數(shù)據(jù)庫(kù),但django中默認(rèn)為sqlite3。仍然在setting.py中找到 DATABASES ,對(duì)內(nèi)容進(jìn)行修改:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm_test', #數(shù)據(jù)庫(kù)名稱
'USER':'root', #用戶
'PASSWORD':'123456', #密碼
'HOST':'localhost', #IP地址,本地測(cè)試為localhost
'PORT':'3306', #端口號(hào)
}
}
里面的“NAME”的值是你數(shù)據(jù)庫(kù)中已有的數(shù)據(jù)庫(kù)名稱,接下里在此數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)表。
在python3 中,連接數(shù)據(jù)庫(kù)的是pymysql,因此在項(xiàng)目同名文件夾下的__init__.py 中加入以下代碼才能正常運(yùn)行。
import pymysql pymysql.install_as_MySQLdb()
三、寫模板文件來創(chuàng)建表結(jié)構(gòu)
在應(yīng)用(cmdb)的 models.py 中開始寫表結(jié)構(gòu),我們要做的就是寫一個(gè)類,類中的屬性為表中的列,ORM將類轉(zhuǎn)換為sql語句。簡(jiǎn)單的寫一個(gè)下面的類,包含用戶名和密碼兩列。
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)
四、生成數(shù)據(jù)表
在終端中輸入命令行 python manage.py makemigrations ,這時(shí)會(huì)在應(yīng)用(cmdb)下的migrations文件夾下出現(xiàn)一個(gè)_initial.py 的文件,它記錄著生成數(shù)據(jù)表結(jié)構(gòu)的一些數(shù)據(jù)的臨時(shí)文件,接著在命令行中輸入 python manage.py migrate,由剛才的臨時(shí)文件生成數(shù)據(jù)表。我們?cè)跀?shù)據(jù)庫(kù)中查看生成的數(shù)據(jù)表,可以看到django生成的不僅僅是剛創(chuàng)建的一個(gè)表,而是十多個(gè)表,除自己的一張表,剩余為django內(nèi)部使用(包含有緩存,cookie,session等,畢竟這么厲害的框架為你做到你想不到的是應(yīng)該的)。在終端中查看一下表結(jié)構(gòu):show create table cmdb_users;

看到的不僅有兩個(gè)自定的屬性列,多出一個(gè)id列,并且是自增的還是主鍵。
五、路由映射關(guān)系
在同名項(xiàng)目文件夾下的urls.py 中導(dǎo)入應(yīng)用(cmdb),寫映射關(guān)系到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), ]
六、視圖及數(shù)據(jù)表的增刪改查
在路由映射到應(yīng)用(cmdb)下的views.py 中,右映射中寫對(duì)應(yīng)的函數(shù),也就是login函數(shù)。用于顯示的觀察項(xiàng)目的運(yùn)行,我們?cè)诖撕瘮?shù)中就先簡(jiǎn)單得的打印到屏幕上一句“Hello World”。
在login函數(shù)中寫入增刪改查的語句。
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() #查看所有
# 條件查詢,結(jié)果為querySet類型,所以循環(huán)取出結(jié)果
# 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')
啟動(dòng)項(xiàng)目后,瀏覽器訪問127.0.0.1:8000/login 就可看到屏幕上的Hello World,表示相關(guān)的數(shù)據(jù)操作已成功修改數(shù)據(jù)表。
相關(guān)操作后數(shù)據(jù)表內(nèi)容的變化如下:
#插入一條數(shù)據(jù)后 mysql> select * from cmdb_users; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | xsmile | 12345 | +----+----------+----------+ 1 row in set (0.00 sec) #再插入三條數(shù)據(jù)后 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) #修改數(shù)據(jù)后 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) #刪除數(shù)據(jù)后 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%',但是對(duì)于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] 的用戶
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Python中實(shí)現(xiàn)對(duì)Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換
這篇文章主要介紹了Python中實(shí)現(xiàn)對(duì)Timestamp和Datetime及UTC時(shí)間之間的轉(zhuǎn)換,例子則主要針對(duì)Ubuntu等類UNIX系統(tǒng),需要的朋友可以參考下2015-04-04
python腳本實(shí)現(xiàn)分析dns日志并對(duì)受訪域名排行
這篇文章主要介紹了python腳本實(shí)現(xiàn)分析dns日志并對(duì)受訪域名排行,本文是在Windows服務(wù)器環(huán)境中實(shí)現(xiàn),需要的朋友可以參考下2014-09-09
深入剖析Python的爬蟲框架Scrapy的結(jié)構(gòu)與運(yùn)作流程
這篇文章主要介紹了Python的爬蟲框架Scrapy的結(jié)構(gòu)與運(yùn)作流程,并以一個(gè)實(shí)際的項(xiàng)目來講解Scrapy的原理機(jī)制,十分推薦!需要的朋友可以參考下2016-01-01
基于Python實(shí)現(xiàn)評(píng)論區(qū)抽獎(jiǎng)功能詳解
這篇文章主要為大家介紹了基于Python如何實(shí)現(xiàn)評(píng)論區(qū)抽獎(jiǎng)的功能,文章的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的朋友可以學(xué)習(xí)一下2021-12-12
pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例
在PyTorch中,數(shù)據(jù)加載和預(yù)處理是深度學(xué)習(xí)中非常重要的一部分,本文主要介紹了pytorch 數(shù)據(jù)預(yù)加載的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-12-12
Django視圖擴(kuò)展類知識(shí)點(diǎn)詳解
這篇文章主要介紹了Django視圖擴(kuò)展類知識(shí)點(diǎn)以及實(shí)例代碼,需要的朋友們可以學(xué)習(xí)下。2019-10-10
python中使用you-get庫(kù)批量在線下載bilibili視頻的教程
這篇文章主要介紹了使用python中you-get庫(kù)批量在線下載bilibili視頻的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03

