Django之数据库--ORM
一、建立数据库模型类
1.在model里创建模型类。(继承models.Model)


- from django.db import models
- # Create your models here.
- class Role(models.Model):
- role_name = models.CharField(max_length=32, unique=True)
- class Meta:
- db_table = "pp_role"
- class Classroom(models.Model):
- class_name = models.CharField(max_length=32,verbose_name="班级名称",unique=True)
- address = models.CharField(max_length=32,null=True)
- class Meta:
- db_table = "pp_class"
- class User(models.Model):
- username = models.CharField(max_length=32,verbose_name="姓名")
- age =models.IntegerField(verbose_name="年龄")
- home = models.CharField(verbose_name="家乡",null=True,max_length=32)
- hight = models.IntegerField(verbose_name="身高",null=True)
- #多对多
- roles = models.ManyToManyField(Role)
- #一对多
- classrooms = models.ForeignKey(Classroom,on_delete=models.CASCADE,null=True)
- class Meta:
- db_table="pp_user"
model
模型里数据可用字段类型
字段类型约束
外键设置
同步模型类的数据到数据库
python manage.py makemigration
python manage.py migrate
二、数据的增加
在views中添加


- def post(self,request):
- data=request.data
- ser=UserSer1(data=data)
- ser.is_valid()
- print(ser.errors)
- ser.save()
- return Response({"code":200})
View
三、数据的删除
在views中添加


- def delete(self,request):
- user_id = request.query_params.get('user_id')
- print(user_id,1111111111111)
- user_obj = User.objects.filter(pk=user_id)
- user_obj.delete()
- return Response({'msg':'sccg'})
View
四、数据的修改
在views中添加


- def put(self,request):
- data=request.data
- id=request.data.get("id")
- user=User.objects.get(id=id)
- Ser=UserSer1(user,data=data)
- Ser.is_valid()
- Ser.save()
- return Response({"code":200})
Views.py
五、数据库的查询
1.基本查询:
user= User.objects.get(btitle='张三') #单一查询,如果结果不存在报错
user= User.objects.all(btitle='张三') #查询多个结果,有多少返回多少,不存在返回None
user= User.objects.count(btitle='张三' ) #查询结果的数量
user= User.objects.exclude(btitle='张三') #查询结果取反
2.模糊查询:
a.contains 是否包含
user= User.objects.filter(btitle__contains='市') #查询结果包含‘市’的
b.startswith,endswith 以指定值开头或结尾
user= User.objects.filter(btitle__startswith='北') #查询以‘北’开头的
user= User.objects.filter(btitle__endswith='市') #查询以‘市’结尾的
3.空查询:
isnull 是否为空
user= User.object.filter(bititle__isnull=Flase) #查询bititle不为空
4.范围查询:
in 在范围内
range 相当于between...and...
book = BookInfo.object.filter(id__in = [1,5,13,24]) #查询id为1或5或13或24
book = BookInfo.object.filter(id__range = [10,20]) #查询范围为10-20的id
5.比较查询:
gt 大于
gte 大于等于
lt 小于
lte 小于等于
exclude 不等于
book = BookInfo.object.filter(id__gt =10) #查询id大于10的
book = BookInfo.object.exclude(id = 10) #查询id不等于的10的
6.日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
book = BookInfo.object.filter(bpub_date__year = 1977) #查询1977年出版的书
book = BookInfo.object.filter(bpub_date__gt =date(1977,1,1)) #查询1977年1月1日以后出版的书
7.F对象和Q对象
比较两个字段对象之间的关系用F对象。(F对象可以进行运算)
book = BookInfio.Object.filter(bread__gte=F('bcomment')) #查询阅读量等于评论量的对象
book = BookInfio.Object.filter(bread__gte=F('bcomment') * 2 )
与逻辑运算符连用使用Q对象。 或( | ) 与( & ) 非( ~ )
book = BookInfo.Object.filter(Q(bread__gte=20) | Q(pk__lt=3)) #查询阅读量为20或者id为3的对象
8.聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg 平均,Count 数量,Max 最大,Min 最小,Sum 求和
book = BookInfo.Object.aggregate(Sum('bread')) #求阅读量的和
9.排序
使用order_by对结果进行排序
book=BookInfo.object.all().order_by('bread') #按阅读量的升序排列
book=BookInfo.object.all().order_by('-bread') #按阅读量的降序排列
10.关联查询
一对多模型
一到多的访问语法:一对应的模型类对象.多对应的模型类名小写_set
b = BookInfo.object.filter(id = 1)
b.heroinfo_set.all() #查询book_id = 1的书里的所有英雄
(一本书里有多个英雄,一个英雄只能存在一本书里。表关系为一对多,英雄表里外键关联书id,英雄表里的存放多个书id。英雄表为多,书表为一。)
多到一的访问语法:多对应的模型类对象.多对应的模型类中的关系类属性名
h = HeroInfo.object.filter(id = 1)
h.hbook #查询英雄id = 1的书是哪本。
方向查询除了可以使用模型类名_set,还有一种是在建立模型类的时候使用related_name来指定变量名。
hbook= model.ForeignKey(HeroInfo,on_delete=model.CACADE,null=Ture,related_name='heros')
b.herose.all()
六、多对多表操作
1、建多对多表
在modle中添加


- class Student(models.Model):
- name = models.CharField(max_length=32)
- # 老师类
- class Teacher(models.Model):
- name = models.CharField(max_length=32)
- stu = models.ManyToManyField(to='Student',related_name='teacher') #让django帮助建立多对多关系表
- model.py
models.py
在views中添加


- class ManyToManyTest(APIView):
- def get(self, request):
- # 方法一:在建立manytomany的models里查数据
- # teacherobj = models.Teacher.objects.get(id=2)
- # data = teacherobj.stu.all()
- # data_list = []
- # for i in data:
- # data_dic={
- # "student_name":i.name,
- # "teacher_name":teacherobj.name
- # }
- # data_list.append(data_dic)
- # return Response(data_list)
- # 方法二:在未建立manytomany的models里查数据
- studentobj = models.Student.objects.get(id=2)
- data = studentobj.teacher_set.all()
- data_list = []
- for i in data:
- data_dic = {
- "student_name": studentobj.name,
- "teacher_name": i.name
- }
- data_list.append(data_dic)
- return Response(data_list)
- def post(self, request):
- # 方法一:在建立manytomany的models里添加数据,(一条,一个对象)
- # teacherobj = models.Teacher.objects.filter(id=1).first()
- # studentobj = models.Student.objects.filter(id=2).first()
- # teacherobj.stu.add(studentobj)
- # return Response({
- # "status": 200
- # })
- #方法二:在未建立manytomany的models里添加数据,(一条,一个对象)
- teacherobj = models.Teacher.objects.all()
- studentobj = models.Student.objects.filter(id=2).first()
- studentobj.teacher_set.set(teacherobj)
- return Response({
- "status": 200
- })
- def put(self, request):
- # 方法一:在建立manytomany的models里修改数据,参数只能是可迭代对象
- teacherobj = models.Teacher.objects.filter(id=3).first()
- studentobj = models.Student.objects.filter(id=2)
- teacherobj.stu.set(studentobj)
- return Response({
- "status": 200
- })
- #方法二:在未建立manytomany的models里修改数据,参数只能是可迭代对象
- # teacherobj = models.Teacher.objects.all()
- # studentobj = models.Student.objects.filter(id=2).first()
- # studentobj.teacher_set.set(teacherobj)
- # return Response({
- # "status": 200
- # })
- def delete(self, request):
- # 方法一:在建立manytomany的models里删除数据,(一条,一个对象)
- # teacherobj = models.Teacher.objects.filter(id=1).first()
- # studentobj = models.Student.objects.filter(id=2).first()
- # teacherobj.stu.remove(studentobj)
- # return Response({
- # "status": 200
- # })
- #方法二:在未建立manytomany的models里删除数据,(多条,可迭代对象)
- teacherobj = models.Teacher.objects.all()
- studentobj = models.Student.objects.filter(id=2).first()
- studentobj.teacher_set.remove(*teacherobj)
- return Response({
- "status": 200
- })
- views.py
Views.py
- 1 HeroInfo.objects.create(
- 2 hname='沙悟净',
- 3 hgender=0,
- 4 hbook=book)
Django之数据库--ORM的更多相关文章
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Django之 数据库ORM
一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套 ...
- django之数据库orm
一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sq ...
- django操作数据库 ORM
一,数据库连接 创建类 a. 在models.py中先写类 from django.db import models # 表名是app01_userinfo class UserInfo(models ...
- Django框架之数据库ORM框架
首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...
- Django学习笔记〇四——数据库ORM的使用(有待修改)
Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...
- Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?
Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...
- ORM,Django对数据库的连接和使用
ORM,Django对数据库连接和使用数据 ORM(对象关系映射) 很多语言中的web框架都有这个概念 为什么要有ORM? 写程序离不开数据 新的语法,不需要我们自己写SQL语句 我们按照新的语法写代 ...
- Django中的ORM进阶操作
Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ...
随机推荐
- 算法笔记之KMP算法
本文是<算法笔记>KMP算法章节的阅读笔记,文中主要内容来源于<算法笔记>.本文主要介绍了next数组.KMP算法及其应用以及对KMP算法的优化. KMP算法主要用于解决字符串 ...
- 2.1获取Git仓库-2.2记录每次更新到仓库
2.1 获取 Git 仓库 获取 Git 仓库通常有两种方式 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器 克隆 一个已存在的 Git 仓库. 在已存在目录中初始化仓库 首先进入该 ...
- wpf 全局异常捕捉+错误日志记录+自动创建桌面图标
/// /// 创建桌面图标 /// public static void CreateShortcutOnDesktop(string LnkName) { String shortcutPath ...
- CORS跨域请求:前后端分离
1. 请求过滤器: /** * OncePerRequestFilter保证在任何Servlet容器中都是一个请求只执行一次的过滤器. */ public class CorsFilter exten ...
- 第三方库文件Joi对数据进行验证的方法以及解决Joi.validate is not a function的问题
Joi:javaScript对象的规则描述语言和验证器 1.npm install joi@14.3.1 2.建立joi.js文件 3.导入第三方包joi const Joi = require('j ...
- python 安装selenium首次运行错误selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH
问题原因: 没有安装相关的支撑driver https://npm.taobao.org/mirrors/chromedriver/ 下载对应的driver 放置到python路径下
- tcp syn-synack-ack 服务端接收ack
TCP 服务端 接收到ack tcp_v4_rcv() -> tcp_v4_do_rcv() -> tcp_v4_hnd_req() + tcp_child_process()tcp_v4 ...
- linux netfilter nat1
linux netfilter nat1 2020整理云笔记上传
- 查找数组中第k大的数
问题: 查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...
- .net core中的哪些过滤器 (Authorization篇)
前言 咱们上篇说到,过滤的简单介绍,但是未介绍如何使用,接下来几篇,我来给大家讲讲如何使用,今天第一篇是Authorization.认证过滤器, 开发环境介绍 开发工具:VS2019 开发环境:.ne ...