第三章:Model 数据层

第一节:数据模型的创建(没有数据库的情况)

定义数据模型

数据类型参考表及约束参考表请参考第一章: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() ,查询所有,如上:查看买家买的全部商品
  • 通过路由增加买家数据(部分数据)
    在这里插入图片描述
  • 中间表展示及查询结果
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

一对多查询数据

买家和订单是一对多的数据关系,一个买家可以买多个商品,形成多个订单,为了展示一对多的查询,可先让买家买东西东西的同时,对订单进行操作,生成订单数据

  • 定义购买时形成订单对象
    在这里插入图片描述在这里插入图片描述

  • 定义路由和路由函数,查询用户订单们
    在这里插入图片描述在这里插入图片描述
    部分查询结果
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/xiangchi7/article/details/85740028