import pymysql
pymysql.install_as_MySQLdb()
关于商品展示部分, 我们需要两张数据库表:
from django.db import models
# Create your models here.
# 商品的分类--模型类
# 对应了数据库的一张表
class GoodsCategory(models.Model):
# 分类名称,最大长度定义
cag_name = models.CharField(max_length=32)
# 分类样式
cag_css = models.CharField(max_length=32)
# 分类图片,图片需要定义到某一个地址,就是哪个文件夹下
cag_img = models.ImageField(upload_to='cag')
# 商品表--模型类
class GoodsInfo(models.Model):
# 商品名称
goods_name = models.CharField(max_length=128)
# 商品价格
goods_price = models.IntegerField(default=0)
# 商品描述
goods_desc = models.CharField(max_length=2048)
# 商品图片
goods_img = models.ImageField(upload_to='goods')
# 所属分类
goods_cag = models.ForeignKey('GoodsCategory')
字段名叫做 goods_name, 字段的类型为 CharField, 对应到 MySQL 数据库的字段类型就为 varchar 类型, 并且长度为100. 除了 CharField, 我们还发现有其他不同的字段类型, 常用字段类型以及含义如下表所示:
使用时需要引入 django.db.models 包,字段类型如下:
字段类型 | 描述 |
---|---|
AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性. |
BooleanField | 布尔字段,值为True或False. |
NullBooleanField | 支持Null、True、False三种值. |
CharField(max_length=长度) | 字符串, 参数max_length表示最大字符个数.CharField必须指定max_length大小 |
TextField | 大文本字段 |
IntegerField | IntegerField 一个整数. 在Django所支持的所有数据库中,从 -2147483648 到 2147483647 范围内的值是合法的. |
DecimalField(max_digits=None, decimal_places=None) | 十进制浮点数.参数max_digits表示总位数.参数decimal_places表示小数位数. |
DateField[auto_now=False, auto_now_add=False]) | 日期. 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为false.参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false.参数auto_now_add和auto_now是相互排斥的,组合将会发生错误. |
TimeField | 时间,参数同DateField |
DateTimeField | 日期时间,参数同DateField. |
FileField | 上传文件字段. |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片. |
BigIntegerField | 一个64位整数, 类似于一个 IntegerField ,它的值的范围是 -9223372036854775808 到9223372036854775807之间. |
SmallIntegerField | 该字段值在 -32768 至 32767 |
表中并未解释 models.ForeignKey 字段的含义, 该字段主要用于建立外键, 表示表和表之间是一对多的关系, 例如, 商品分类和商品信息表之间就属于一对多的关系. 我们就可在商品信息模型中建立对商品分类的外键.
每个字段都会有一些字段选项:
选项类型 | 描述 |
---|---|
null | 如果为True,表示允许为空,默认值是False. |
db_column | 字段的名称,如果未指定,则使用属性的名称. |
db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False. |
default | 默认值 |
primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用. |
unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False. |
关于购物车部分, 我们也需要两张表:
from django.db import models
# Create your models here.
# 订单信息"""订单信息模型"""
class OrderInfo(models.Model):
status = (
(1, '待付款'),
(2, '待发货'),
(3, '待收货'),
(4, '已完成')
)
# 订单编号
order_id = models.CharField(max_length=128)
# 收货地址
order_addr = models.CharField(max_length=2048)
# 收货人
order_recv = models.CharField(max_length=32)
# 联系电话
order_tele = models.CharField(max_length=11)
# 运费
order_fee = models.IntegerField(default=10)
# 订单备注
order_extra = models.CharField(max_length=1024)
# 订单状态
order_status = models.IntegerField(default=1,choices=status)
"""订单商品模型"""
class OrderGoods(models.Model):
# 所属商品,外键关联goods里面商品信息表
goods_info = models.ForeignKey('goods.GoodsInfo')
# 商品数量
goods_num = models.IntegerField()
# 商品所属订单,外键关联订单表
goods_order = models.ForeignKey('OrderInfo')
如下代码:
order_status = models.IntegerField(default=1, choices=status)
该代码中的 choices=status 表示的值为 status 指定的 4 个值中的一个.
下面在终端执行迁移命令:
python manage.py makemigrations
# 所属商品,外键关联goods里面商品信息表
goods_info = models.ForeignKey('goods.GoodsInfo',on_delete=models.CASCADE)
# 商品数量
goods_num = models.IntegerField()
# 商品所属订单,外键关联订单表
goods_order = models.ForeignKey('OrderInfo',on_delete=models.CASCADE)
pip install Pillow
生成2个001文件,0001_initial.py 文件我们可以理解为 SQL 的配置文件, 我们可将其转换为 SQL语句, 执行如下命令:python manage.py sqlmigrate goods 0001
python manage.py migrate
from goods.models import *
categories = [('新鲜水果', 'fruit',1), ('海鲜水产', 'seafood',2), ('猪牛羊肉', 'meet',3), ('禽类蛋品', 'egg',4), ('新鲜蔬菜', 'vegetables',5), ('速冻食品', 'ice',6)]
for cag in categories:
c = GoodsCategory()
c.cag_name = cag[0]
c.cag_css = cag[1]
c.cag_img = 'images/banner0%d.jpg' % cag[2]
c.save()
我们创建一条数据, 只需要创建一个对应模型的实例对象, 然后调用该对象的 save 方法, 即可向数据库中添加一条数据. 我们上面的代码, 通过 for 循环向数据库中插入了我们项目需要的商品分类数据.
>>> from goods.models import *
>>> goods = GoodsInfo()
>>> goods.goods_name = '新疆库尔勒酥梨'
>>> goods.goods_price = 30
>>> goods.goods_desc = '新疆库尔勒酥梨香脆可口'
>>> goods.goods_img = 'xiangli'
>>> goods.goods_cag_id = 1
>>> goods.save()
>>>
>>> goods = GoodsInfo.objects.get(id=3)
>>> print(goods.goods_name,goods.goods_price)
果缤纷 墨西哥巨无霸牛油果 6粒 约1200g 98
>>> allcags=GoodsCategory.objects.all()
>>> print(allcags)
, , , , , ]>
切片查询
all 方法返回包含数据库中所有对象的一个查询结果集。对结果使用切片语法, 例:获得所有结果集的前两个对象组成的结果集:
>>> cags=GoodsCategory.objects.all()[0:3]
>>> print(cags)
, , ]>
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()
>>> cag = GoodsCategory.objects.get(id=1)
>>> cag.cag_name = 'new name'
>>> cag.save()
cag = GoodsCategory.objects.get(id=1)
cag.cag_name = '新分类名字'
cag.delete()