Django中ORM表的創(chuàng)建和增刪改查方法示例
前言
Django作為重量級的Python web框架,在做項目時肯定少不了與數(shù)據(jù)庫打交道,編程人員對數(shù)據(jù)庫的語法簡單的還行,但過多的數(shù)據(jù)庫語句不是編程人員的重點對象。因此用ORM來操作數(shù)據(jù)庫相當(dāng)快捷。今天來介紹一下用ORM操作數(shù)據(jù)庫。
一、創(chuàng)建Django項目
可以使用pycharme專業(yè)版直接快速創(chuàng)建。如果不是專業(yè)版也可以使用命令進(jìn)行創(chuàng)建。下面列出命令行創(chuàng)建方式:
django-admin startproject orm_test
這時會在當(dāng)前目錄創(chuàng)建文件夾名為orm_test,接下來進(jìn)入orm_test文件夾中,執(zhí)行命令:
python manage.py runserver
就啟動了該項目,默認(rèn)瀏覽器訪問127.0.0.1:8000就可以看到項目運行成功的提示。
接下來我們用命令在項目中創(chuàng)建一個應(yīng)用:
django-admin startapp cmdb
此時基本準(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ù)庫,但django中默認(rèn)為sqlite3。仍然在setting.py中找到 DATABASES ,對內(nèi)容進(jìn)行修改:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'orm_test', #數(shù)據(jù)庫名稱 'USER':'root', #用戶 'PASSWORD':'123456', #密碼 'HOST':'localhost', #IP地址,本地測試為localhost 'PORT':'3306', #端口號 } }
里面的“NAME”的值是你數(shù)據(jù)庫中已有的數(shù)據(jù)庫名稱,接下里在此數(shù)據(jù)庫中創(chuàng)建數(shù)據(jù)表。
在python3 中,連接數(shù)據(jù)庫的是pymysql,因此在項目同名文件夾下的__init__.py 中加入以下代碼才能正常運行。
import pymysql pymysql.install_as_MySQLdb()
三、寫模板文件來創(chuàng)建表結(jié)構(gòu)
在應(yīng)用(cmdb)的 models.py 中開始寫表結(jié)構(gòu),我們要做的就是寫一個類,類中的屬性為表中的列,ORM將類轉(zhuǎn)換為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)
四、生成數(shù)據(jù)表
在終端中輸入命令行 python manage.py makemigrations ,這時會在應(yīng)用(cmdb)下的migrations文件夾下出現(xiàn)一個_initial.py 的文件,它記錄著生成數(shù)據(jù)表結(jié)構(gòu)的一些數(shù)據(jù)的臨時文件,接著在命令行中輸入 python manage.py migrate,由剛才的臨時文件生成數(shù)據(jù)表。我們在數(shù)據(jù)庫中查看生成的數(shù)據(jù)表,可以看到django生成的不僅僅是剛創(chuàng)建的一個表,而是十多個表,除自己的一張表,剩余為django內(nèi)部使用(包含有緩存,cookie,session等,畢竟這么厲害的框架為你做到你想不到的是應(yīng)該的)。在終端中查看一下表結(jié)構(gòu):show create table cmdb_users;
看到的不僅有兩個自定的屬性列,多出一個id列,并且是自增的還是主鍵。
五、路由映射關(guān)系
在同名項目文件夾下的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 中,右映射中寫對應(yīng)的函數(shù),也就是login函數(shù)。用于顯示的觀察項目的運行,我們在此函數(shù)中就先簡單得的打印到屏幕上一句“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')
啟動項目后,瀏覽器訪問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%',但是對于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é)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
python圖片指定區(qū)域替換img.paste函數(shù)的使用
這篇文章主要介紹了python圖片指定區(qū)域替換img.paste函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04python之no module named xxxx以及虛擬環(huán)境配置過程
在Python開發(fā)過程中,經(jīng)常會遇到環(huán)境配置和包管理的問題,主要原因包括未安裝所需包或使用虛擬環(huán)境導(dǎo)致的,通過pip install命令安裝缺失的包是解決問題的一種方式,此外,使用虛擬環(huán)境,例如PyCharm支持的Virtualenv,可以為每個項目創(chuàng)建獨立的運行環(huán)境2024-10-10python使用MySQLdb訪問mysql數(shù)據(jù)庫的方法
這篇文章主要介紹了python使用MySQLdb訪問mysql數(shù)據(jù)庫的方法,實例分析了Python使用MySQLdb模塊操作mysql數(shù)據(jù)庫的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-08-08numpy中hstack vstack stack concatenate函數(shù)示例詳解
這篇文章主要為大家介紹了numpy中hstack vstack stack concatenate函數(shù)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02詳解Python的Django框架中Manager方法的使用
這篇文章主要介紹了Python的Django框架中Manager方法的使用,包括修改初始Manager QuerySets和增加額外的Manager方法等操作,需要的朋友可以參考下2015-07-07