数据库操作
首先在终端输入命令:
代码语言:javascript复制python manage.py shell
显示界面如下图所示:
此时进入 shell, 我们可在 shell 中通过面向对象方式对数据库中的数据进行 CRUD 操作.
1 插入操作
在 Django 中我们不需要编写一行 SQL 语句, 就可以对数据库中的数据进行操作. 完全基于面向对象的方式. 下面我们通过面向对象的方式在数据库的商品分类表中插入数据, 执行代码如下:
代码语言:javascript复制from goods.models import *
categories = [('新鲜水果', 'fruit'), ('海鲜水产', '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' % index
c.save()
我们创建一条数据, 只需要创建一个对应模型的实例对象, 然后调用该对象的 save 方法, 即可向数据库中添加一条数据. 我们上面的代码, 通过 for 循环向数据库中插入了我们项目需要的商品分类数据.
执行效果如下图所示:
查看数据库中执行结果, 如下图所示:
为了加深印象, 我们再通过同样的方式向数据库中插入商品数据. 我们商品数据对应的商品名称被定义在 data.txt 的数据文件中, 该文件路径为项目根目录. 我们读取该文件中的数据, 并将其插入到数据库中.
data.txt 数据文件部分内容如下:
代码语言:javascript复制苹果
杏子
槟榔子
香蕉
山毛榉坚果
海棠果
酸橙
黑莓
...
对应商品图片数据我们放置在了 static/goods目录下, 文件目录如下图所示:
插入商品数据代码如下:
代码语言:javascript复制from goods.models import *
from random import randint
# 商品计量单位
goods_unit = ['100克', '200克', '1斤', '5斤', '1个', '2个']
with open('./data.txt', 'r') as file:
for line in file:
# 创建商品对象
goods = GoodsInfo()
# 设置属性值
goods.goods_name = line[:-1] # 去除名字之后的空格
goods.goods_price = randint(100, 999)
goods.goods_img = 'goods/%s.jpg' % randint(1, 18)
goods.goods_desc = '商品详细信息描述!'
goods.goods_unit = goods_unit[randint(0, len(goods_unit) - 1)]
goods.goods_cag_id = randint(1, 6) # 设置商品所属分类
goods.save()
这里需要额外说明一点, goods_cag = models.ForeignKey('GoodsCategory')
实际在数据库中存储的是商品分类数据的主键. 设置商品所属分类:
# 创建商品分类
cag = GoodsCategory()
...
cag.save()
goods = GoodsInfo()
...
goods.goods_cag = cag
goods.save()
代码执行效果如下图所示:
查看数据库中执行结果, 如下图所示:
2 查询操作
查询操作我们主要用到了3个方法:
- get, 查询一条数据.
- all, 获得所有数据.
- filter, 根据条件过滤数据.
get 方法:
如果你知道只有一个对象满足你的查询,你可以使用管理器的 get 方法,它直接返回该对象. 例: 查询商品名字为 "香蕉" 的对象.
代码语言:javascript复制from goods.models import *
goods = GoodsInfo.objects.get(goods_name='香蕉')
print('商品名字:', goods.goods_name)
objects 为 GoodsInfo 类的对象属性, 该对象属性叫做管理器对象, 在该对象中封装了用于数据库操作的方法, 例如, get 方法就是在 objects 对象定义的方法.
如果匹配到的对象个数不只一个的话,get 将会触发 MultipleObjectsReturned 异常. MultipleObjectsReturned 异常是模型类的属性. 如果根据给出的参数匹配不到对象的话, 将触发DoesNotExist 异常. 这个异常是模型类的属性.
all 方法:
获取一个表中所有对象的最简单的方式是全部获取。可以使用管理器的 all 方法:
代码语言:javascript复制all_cags = GoodsCategory.objects.all()
all 方法返回包含数据库中所有对象的一个查询结果集。对结果使用切片语法, 例:获得所有结果集的前两个对象组成的结果集:
代码语言:javascript复制cags = GoodsCategory.objects.all()[1: 3]
filter 方法:
all 方法返回了一个包含数据库表中所有记录查询集. 但在通常情况下,我们往往想要获取的是完整数据集的一个子集. 要创建这样一个子集,你需要在原始的的查询集上增加一些过滤条件。
例如, 查询分类 ID 为1的所有商品.
代码语言:javascript复制from goods.models import *
# 查询ID为1的分类
cag = GoodsCategory.objects.get(id=1)
goods_list = GoodsInfo.objects.filter(goods_cag=cag)
goods_list.count()
执行效果如下图所示:
3 更新操作
Django 创建和更新对象,使用同一个函数save(). 当调用save()时, django会判断对象是否有主键,如果存在则调用更新,如果不存在则创建数据.
代码语言:javascript复制cag = GoodsCategory.objects.get(id=1)
cag.cag_name = '新分类名字'
cag.save()
4 删除操作
代码语言:javascript复制cag = GoodsCategory.objects.get(id=1)
cag.cag_name = '新分类名字'
cag.delete()