django项目环境搭建,数据库配置练习笔记

django环境准备

1,安装Django,pip install django

2,安装MySQL,pip install pymysql

如果有虚拟环境那就在虚拟环境安装以上包

创建项目

1,创建Django项目

2,项目中添加文件

在termal里面输入:python manage.py startapp goods,增加的文件夹带所有需要的文件 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201119155828549.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1NTkxNg==,size_16,color_FFFFFF,t_70#pic_center)

3,项目中setting增加新增加的模块名称

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201119155953528.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1NTkxNg==,size_16,color_FFFFFF,t_70#pic_center)

4,setting配置数据库信息

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201119160052216.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mzc1NTkxNg==,size_16,color_FFFFFF,t_70#pic_center)

5,项目中的__init__.py中导入pymysql

import pymysql
pymysql.install_as_MySQLdb()

数据库设计

在 Django 中一个模型类就对应着数据库中的一张表, 对模型类的任何操作都是对数据库表的操作. 在该项目中, 我们需要对业务进行分析, 然后创建所需要的表.

关于商品展示部分, 我们需要两张数据库表:

  • GoodsCategory 表, 存储商品分类信息.
    • 分类显示名称
    • 分类显示样式
    • 分类显示图片
  • GoodsInfo 表, 存储商品具体信息.
    • 商品名称
    • 商品单位
    • 商品价格
    • 商品图片
    • 商品描述
    • 商品分类
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.
  • null.如果为True,Django 将会把数据库中空值保存为NULL。默认值是 False.
  • blank. 如果为True,该字段允许为空值,默认为False。要注意,这与 null 不同。null纯粹是数据库范畴,指数据库中字段内容是否允许为空,而 blank 是表单数据输入验证范畴的。如果一个字段的blank=True,表单的验证将允许输入一个空值。如果字段的blank=False,该字段就是必填的。
  • primary_key.如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,Django 就会自动添加一个IntegerField 字段做为主键,所以除非你想覆盖默认的主键行为,否则没必要设置任何一个字段的primary_key=True。主键字段是只读的。如果你在一个已存在的对象上面更改主键的值并且保存,一个新的对象将会在原有对象之外创建出来。

关于购物车部分, 我们也需要两张表:

  • OrderInfo 表, 存储订单基本信息.
    • 订单编号
    • 收货地址
    • 收货人
    • 联系电话
    • 订单运费
    • 订单备注
    • 订单状态
  • OrderGoods 表, 存储订单所对应的商品信息.
    • 订单商品
    • 商品数量
    • 所属订单
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 个值中的一个.

创建迁移文件

我们所需要的模型创建好了, 下面就需要 Django 按照我们所定义的模型类来创建对应的数据库表. 首先我们先查看下项目目录结构, 会发现在 goods 应用和 cart 应用的 migrations 目录为空, 当我们执行迁移命令时, 对比该目录的变化:

下面在终端执行迁移命令:

python manage.py makemigrations

遇到问题1: mysqlclient 1.3.13 or newer is required; you have 0.9.3 错误,解决方案:

降级Django版本,pip uninstall django 然后,pip install django==2.1.7

遇到问题2:TypeError: __init__() missing 1 required positional argument: 'on_delete',解决方案:

  # 所属商品,外键关联goods里面商品信息表
    goods_info = models.ForeignKey('goods.GoodsInfo',on_delete=models.CASCADE)
    # 商品数量
    goods_num = models.IntegerField()
    # 商品所属订单,外键关联订单表
    goods_order = models.ForeignKey('OrderInfo',on_delete=models.CASCADE)

遇到问题3HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".,解决方案:

pip install Pillow

django项目环境搭建,数据库配置练习笔记_第1张图片
生成2个001文件,0001_initial.py 文件我们可以理解为 SQL 的配置文件, 我们可将其转换为 SQL语句, 执行如下命令:python manage.py sqlmigrate goods 0001
django项目环境搭建,数据库配置练习笔记_第2张图片

执行迁移文件

执行对应的 SQL 语句, 在数据库中创建对应的数据库表, 执行迁移的命令如下:
python manage.py migrate

django项目环境搭建,数据库配置练习笔记_第3张图片
django项目环境搭建,数据库配置练习笔记_第4张图片

Django数据库操作

Django插入操作

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 循环向数据库中插入了我们项目需要的商品分类数据.

django项目环境搭建,数据库配置练习笔记_第5张图片
django项目环境搭建,数据库配置练习笔记_第6张图片
插入商品表

>>> 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()
>>>

django项目环境搭建,数据库配置练习笔记_第7张图片

查询数据

get查询一个值

>>> goods = GoodsInfo.objects.get(id=3)
>>> print(goods.goods_name,goods.goods_price)
果缤纷 墨西哥巨无霸牛油果 6粒 约1200g 98

all 方法:查询多个值

>>> allcags=GoodsCategory.objects.all()
>>> print(allcags)
, , , , , ]>

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

>>> cags=GoodsCategory.objects.all()[0:3]
>>> print(cags)
, , ]>

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()

django项目环境搭建,数据库配置练习笔记_第8张图片

更新数据

>>> cag = GoodsCategory.objects.get(id=1)
>>> cag.cag_name = 'new name'
>>> cag.save()

django项目环境搭建,数据库配置练习笔记_第9张图片

删除

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

你可能感兴趣的:(Python,python,mysql)