【Django】基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作
數(shù)據(jù)庫操作
首先在終端輸入命令:
python manage.py shell顯示界面如下圖所示:
此時(shí)進(jìn)入 shell, 我們可在 shell 中通過面向?qū)ο蠓绞綄?duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行 CRUD 操作.
1 插入操作
在 Django 中我們不需要編寫一行 SQL 語句, 就可以對(duì)數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行操作. 完全基于面向?qū)ο蟮姆绞? 下面我們通過面向?qū)ο蟮姆绞皆跀?shù)據(jù)庫的商品分類表中插入數(shù)據(jù), 執(zhí)行代碼如下:
from goods.models import * categories = [('新鮮水果', 'fruit'), ('海鮮水產(chǎn)', 'seafood'), ('豬牛羊肉', 'meet'), ('禽類蛋品', 'egg'), ('新鮮蔬菜', 'vegetables'), ('速凍食品', 'ice')] for index, cag in zip(range(1, 7), categories):c = GoodsCategory()c.cag_name = cag[0]c.cag_css = cag[1]c.cag_img = 'images/banner0%d.jpg' % indexc.save()我們創(chuàng)建一條數(shù)據(jù), 只需要?jiǎng)?chuàng)建一個(gè)對(duì)應(yīng)模型的實(shí)例對(duì)象, 然后調(diào)用該對(duì)象的 save 方法, 即可向數(shù)據(jù)庫中添加一條數(shù)據(jù). 我們上面的代碼, 通過 for 循環(huán)向數(shù)據(jù)庫中插入了我們項(xiàng)目需要的商品分類數(shù)據(jù).
執(zhí)行效果如下圖所示:
查看數(shù)據(jù)庫中執(zhí)行結(jié)果, 如下圖所示:
為了加深印象, 我們?cè)偻ㄟ^同樣的方式向數(shù)據(jù)庫中插入商品數(shù)據(jù). 我們商品數(shù)據(jù)對(duì)應(yīng)的商品名稱被定義在 data.txt 的數(shù)據(jù)文件中, 該文件路徑為項(xiàng)目根目錄. 我們讀取該文件中的數(shù)據(jù), 并將其插入到數(shù)據(jù)庫中.
data.txt 數(shù)據(jù)文件部分內(nèi)容如下:
蘋果 杏子 檳榔子 香蕉 山毛櫸堅(jiān)果 海棠果 酸橙 黑莓 ...對(duì)應(yīng)商品圖片數(shù)據(jù)我們放置在了 static/goods目錄下, 文件目錄如下圖所示:
插入商品數(shù)據(jù)代碼如下:
from goods.models import * from random import randint ? ? # 商品計(jì)量單位 goods_unit = ['100克', '200克', '1斤', '5斤', '1個(gè)', '2個(gè)'] ? with open('./data.txt', 'r') as file: ?for line in file: ?# 創(chuàng)建商品對(duì)象goods = GoodsInfo()# 設(shè)置屬性值goods.goods_name = line[:-1] ?# 去除名字之后的空格goods.goods_price = randint(100, 999)goods.goods_img = 'goods/%s.jpg' % randint(1, 18)goods.goods_desc = '商品詳細(xì)信息描述!'goods.goods_unit = goods_unit[randint(0, len(goods_unit) - 1)]goods.goods_cag_id = randint(1, 6) ?# 設(shè)置商品所屬分類goods.save()這里需要額外說明一點(diǎn), goods_cag = models.ForeignKey('GoodsCategory') 實(shí)際在數(shù)據(jù)庫中存儲(chǔ)的是商品分類數(shù)據(jù)的主鍵. 設(shè)置商品所屬分類:
# 創(chuàng)建商品分類 cag = GoodsCategory() ... cag.save() ? goods = GoodsInfo() ... goods.goods_cag = cag goods.save()代碼執(zhí)行效果如下圖所示:
查看數(shù)據(jù)庫中執(zhí)行結(jié)果, 如下圖所示:
2 查詢操作
查詢操作我們主要用到了3個(gè)方法:
get, 查詢一條數(shù)據(jù).
all, 獲得所有數(shù)據(jù).
filter, 根據(jù)條件過濾數(shù)據(jù).
get 方法:
如果你知道只有一個(gè)對(duì)象滿足你的查詢,你可以使用管理器的 get 方法,它直接返回該對(duì)象. 例: 查詢商品名字為 "香蕉" 的對(duì)象.
from goods.models import * goods = GoodsInfo.objects.get(goods_name='香蕉') print('商品名字:', goods.goods_name)objects 為 GoodsInfo 類的對(duì)象屬性, 該對(duì)象屬性叫做管理器對(duì)象, 在該對(duì)象中封裝了用于數(shù)據(jù)庫操作的方法, 例如, get 方法就是在 objects 對(duì)象定義的方法.
如果匹配到的對(duì)象個(gè)數(shù)不只一個(gè)的話,get 將會(huì)觸發(fā) MultipleObjectsReturned 異常. MultipleObjectsReturned 異常是模型類的屬性. 如果根據(jù)給出的參數(shù)匹配不到對(duì)象的話, 將觸發(fā)DoesNotExist 異常. 這個(gè)異常是模型類的屬性.
all 方法:
獲取一個(gè)表中所有對(duì)象的最簡(jiǎn)單的方式是全部獲取。可以使用管理器的 all 方法:
all_cags = GoodsCategory.objects.all()all 方法返回包含數(shù)據(jù)庫中所有對(duì)象的一個(gè)查詢結(jié)果集。對(duì)結(jié)果使用切片語法, 例:獲得所有結(jié)果集的前兩個(gè)對(duì)象組成的結(jié)果集:
cags = GoodsCategory.objects.all()[1: 3]filter 方法:
all 方法返回了一個(gè)包含數(shù)據(jù)庫表中所有記錄查詢集. 但在通常情況下,我們往往想要獲取的是完整數(shù)據(jù)集的一個(gè)子集. 要?jiǎng)?chuàng)建這樣一個(gè)子集,你需要在原始的的查詢集上增加一些過濾條件。
例如, 查詢分類 ID 為1的所有商品.
from goods.models import * # 查詢ID為1的分類 cag = GoodsCategory.objects.get(id=1) goods_list = GoodsInfo.objects.filter(goods_cag=cag) goods_list.count()執(zhí)行效果如下圖所示:
3 更新操作
Django 創(chuàng)建和更新對(duì)象,使用同一個(gè)函數(shù)save(). 當(dāng)調(diào)用save()時(shí), django會(huì)判斷對(duì)象是否有主鍵,如果存在則調(diào)用更新,如果不存在則創(chuàng)建數(shù)據(jù).
cag = GoodsCategory.objects.get(id=1) cag.cag_name = '新分類名字' cag.save()4 刪除操作
cag = GoodsCategory.objects.get(id=1) cag.cag_name = '新分類名字' cag.delete()?
總結(jié)
以上是生活随笔為你收集整理的【Django】基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AI机器学习实战の电磁导航智能车中神经网
- 下一篇: ES6部分常用语法