第一节:数据模型的创建(没有数据库的情况)
定义数据模型
数据类型参考表及约束参考表请参考第一章:https://blog.csdn.net/xiangchi7/article/details/85392041#_175
例:
连接MySQL数据库
Django中虽然有自带的SQLite这种轻量级的关系型数据库,但是目前并不完全普及。并且SQLite在并发(包括多进程和多线程)读写方面的性能一直不太理想。数据库可能会出现读写操作阻塞或出错。并且官方网站也指出SQLite不支持外键约束。有时候需要访问其它机器上的SQLite数据库文件,就会把数据库文件放置到网络共享目录上。这也是非常不安全的(比如数据损坏)。
安装pymsql
pip3 install pymysql
初始化数据库引擎
登陆并创建mysql数据库
# 登陆数据库
pymysql -u root -p
# 查看数据库
show databases;
#创建数据库
create database xxxxx charset=utf8;
定义配置数据库
##### 执行数据迁移
# 生成迁移文件
python manage.py makemigrations
# 数据迁移
python mananger.py migrate
pycham 连接mysql
【翻外篇】自生成数据模型(已有数据库情况)
连接MySQL数据库
初始化数据库引擎
定义配置已有的数据库
根据数据库去自动生成新的models文件
# 对数据库进行映射
python manage.py inspectdb
#导出并且生成models.py
python manage.py inspectdb > models.py
此时,会发现在manage.py的同级目录下生成了一个models.py
文件
使用这个models.py文件覆盖app中的原models文件。
如果完成了以上的操作,生成的是一个不可修改/删除的models,修改meta class中的managed = True
则可以去告诉django可以对数据库进行操作
执行数据迁移
# 生成迁移文件
python manage.py makemigrations
# 数据迁移
python mananger.py migrate
第二节:创建用户管理系统
创建系统超级用户及语言设置请参考第二章Djgo后台管理:https://blog.csdn.net/xiangchi7/article/details/85629113
注册数据模型(表名)
创建个性化管理类
个性化管规则可追ModelAdmin查看,也可参考第二章Djgo后台管理:https://blog.csdn.net/xiangchi7/article/details/85629113
第三节:表关系的建立
表关系参考
- 外键参考
表关系 | 代码 | 备注 |
---|---|---|
一对一(OneToOneField) | model.OneToOneField(object) |
|
一对多(ForeignKey) | model.ForeignKey(object) |
|
多对多(ManyToManyField) | model.ManyToManyField(object) |
定义表关系字段
如果已经有数据,在执行数据迁移时,会发生默认数据设定选择的情况
后台添加数据
- 添加用户
- 添加商品
- 添加帐户
因为有了外键,Admin中的账户显示字段可添加外键字段,返回“str”的返回值。一目了然地看到账号的用户是谁
注意:多对多字段的外键,是禁止显示的。
通过路由进行增删改查
增删改查的对象关系映射API
- 增添数据API参考:
# 创建一个类对象
Obj = className()
# 指定对象的字段值
Obj.field = "xxx"
# 存储对象
Obj.save()
- 查询数据API参考
# 查所有
Objs = className.objects.all()
# 只查一个
Obj = className.objects.get(field="xxx")
Obj = className.objects.get(pk=10)
# 查首尾
Obj = Objs.last()
Obj = Objs.first()
# 查数量
Num = Objs.count()
# 判断是否存在
answer = Objs.exists()
# 使用过滤器过滤查询
# 格式1:属性名_运算符 = "xxx"
# 常用运算符:gt(大于) endswith(以xx结尾) iendswith(忽略大小写)
# lt(小于) startswith(以xx开头) istartswith(忽略大小写)
# gte(大于等于) contains(包含) icontains(忽略大小写)
# lte(小于等于) exact(精确等于) iexact(忽略大小写)
# 格式2:属性名 = "xxx"(忽略大小写)
filter(条件语句) #获取符合条件的
exclude(条件语句) #去除不符合条件的
# 例:
Objs = className.objects.filter(field_endswith="xxx")
Objs = className.objects.filter(field="xxx")
Objs = className.objects.filter(pk_in=[1,2,3,4])
Objs = className.objects.filter(timeField_year="2019")
Objs = className.objects.filter(Field_id_gt=F('id')-5)
# 重定向选
Objs = className.objects.all().order_by("id")[0:2]
Objs = className.objects.filter(field_gt=100).exclude(fild_gt=150).filter(field_contains="水")
Objs = className.objects.filter(field_gt=100).filter(field_lt=150)
- 删除数据API参考
# 查询一个xxx对象
xxxx.delete()
- 修改数据API参考
# 查询一个xxx对象
xxxx.field = "AAA"
xxxx.save()
路由分发
1、子应用下新建路由文件 “urls.py”
2、主应用声明分发路径
3、子应用下创建路由和路由函数
定义路由函数并执行增删改查
部分执行结果:
注意:增加和修改,必需用 g.save( ) 保存修改后结果
一对一查询数据
1、定义路由
2、定义路由函数
执行结果:
多对多查询数据
买家和商品是多对多的数据关系,一个商品可以给多个买家购买,一个买家也可以购买多个商品,为了展示多对多的查询,可先让买家买点东西,构成中间表关系数据
- 定义路由
- 定义路由函数
注意:多对多的查询,是互相关联的,有外键字段名时,可以使用 className.field.all() ,查询所有,如上:查看某商品的全部买家。但外键字段名可用 className.xxx_set.all() ,查询所有,如上:查看买家买的全部商品
- 通过路由增加买家数据(部分数据)
- 中间表展示及查询结果
一对多查询数据
买家和订单是一对多的数据关系,一个买家可以买多个商品,形成多个订单,为了展示一对多的查询,可先让买家买东西东西的同时,对订单进行操作,生成订单数据
-
定义购买时形成订单对象
-
定义路由和路由函数,查询用户订单们
部分查询结果