Django基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作

Posted Vax_Loves_1314

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作相关的知识,希望对你有一定的参考价值。

数据库操作

首先在终端输入命令:

python manage.py shell

显示界面如下图所示:

此时进入 shell, 我们可在 shell 中通过面向对象方式对数据库中的数据进行 CRUD 操作.

1 插入操作

在 Django 中我们不需要编写一行 SQL 语句, 就可以对数据库中的数据进行操作. 完全基于面向对象的方式. 下面我们通过面向对象的方式在数据库的商品分类表中插入数据, 执行代码如下:

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 数据文件部分内容如下:

苹果
杏子
槟榔子
香蕉
山毛榉坚果
海棠果
酸橙
黑莓
...

对应商品图片数据我们放置在了 static/goods目录下, 文件目录如下图所示:

插入商品数据代码如下:

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个方法:

  1. get, 查询一条数据.

  2. all, 获得所有数据.

  3. filter, 根据条件过滤数据.

get 方法:

如果你知道只有一个对象满足你的查询,你可以使用管理器的 get 方法,它直接返回该对象. 例: 查询商品名字为 "香蕉" 的对象.

from goods.models import *
goods = GoodsInfo.objects.get(goods_name='香蕉')
print('商品名字:', goods.goods_name)

objects 为 GoodsInfo 类的对象属性, 该对象属性叫做管理器对象, 在该对象中封装了用于数据库操作的方法, 例如, get 方法就是在 objects 对象定义的方法.

如果匹配到的对象个数不只一个的话,get 将会触发 MultipleObjectsReturned 异常. MultipleObjectsReturned 异常是模型类的属性. 如果根据给出的参数匹配不到对象的话, 将触发DoesNotExist 异常. 这个异常是模型类的属性.

all 方法:

获取一个表中所有对象的最简单的方式是全部获取。可以使用管理器的 all 方法:

all_cags = GoodsCategory.objects.all()

all 方法返回包含数据库中所有对象的一个查询结果集。对结果使用切片语法, 例:获得所有结果集的前两个对象组成的结果集:

cags = GoodsCategory.objects.all()[1: 3]

filter 方法:

all 方法返回了一个包含数据库表中所有记录查询集. 但在通常情况下,我们往往想要获取的是完整数据集的一个子集. 要创建这样一个子集,你需要在原始的的查询集上增加一些过滤条件。

例如, 查询分类 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()

执行效果如下图所示:

3 更新操作

Django 创建和更新对象,使用同一个函数save(). 当调用save()时, django会判断对象是否有主键,如果存在则调用更新,如果不存在则创建数据.

cag = GoodsCategory.objects.get(id=1)
cag.cag_name = '新分类名字'
cag.save()

4 删除操作

cag = GoodsCategory.objects.get(id=1)
cag.cag_name = '新分类名字'
cag.delete()

 

以上是关于Django基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

Django基于PythonWeb的Django框架设计实现天天生鲜系统-1

Django基于PythonWeb的Django框架设计实现天天生鲜系统-6Django中Cookie存取

Django基于PythonWeb的Django框架设计实现天天生鲜系统-5数据库操作

Django基于PythonWeb的Django框架设计实现天天生鲜系统-4创建视图

Django基于PythonWeb的Django框架设计实现天天生鲜系统-3模型创建

新星计划Django基于PythonWeb的Django框架设计实现天天生鲜系统-10订单提交成功页面功能实现