一、建立数据库模型类

  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的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. Django之 数据库ORM

    一.ORM Django的 业务 少不了 跟数据库打交道,不然没有数据库保存一些数据将是一件很糟糕的事情.Django 对 数据库 支持原生的 SQL语句,但更好的对数据库支持,Django自己有一套 ...

  3. django之数据库orm

    一.数据库的配置 1 django默认支持sqlite,mysql, oracle,postgresql数据库. <1>sqlite django默认使用sqlite的数据库,默认自带sq ...

  4. django操作数据库 ORM

    一,数据库连接 创建类 a. 在models.py中先写类 from django.db import models # 表名是app01_userinfo class UserInfo(models ...

  5. Django框架之数据库ORM框架

    首先,我来介绍一下什么是ORM框架: O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思.在ORM框架中,它帮 ...

  6. Django学习笔记〇四——数据库ORM的使用(有待修改)

    Django框架基本上都是要和数据库结合使用的,我在以前讲过SQLAlchemy框架的使用,Django支持的不是SQLAlchemy,但是也内嵌了ORM框架,可以不需要直接面对数据库编程,而可以通过 ...

  7. Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?

    Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...

  8. ORM,Django对数据库的连接和使用

    ORM,Django对数据库连接和使用数据 ORM(对象关系映射) 很多语言中的web框架都有这个概念 为什么要有ORM? 写程序离不开数据 新的语法,不需要我们自己写SQL语句 我们按照新的语法写代 ...

  9. Django中的ORM进阶操作

    Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ...

随机推荐

  1. Java -- "final" 的理解

    Java具有继承和多态的特性,这也造就了Java语言的面向对象的灵活性.但是,过于灵活就意味的有失控的可能性. 于是,产生了final 的概念 -- 为了数据的绝对安全,无法被后期修改,英文称之为 m ...

  2. php正则匹配整数

    <?php if(!preg_match('/^([1-9][0-9]*){1,10}$/',$buy_sku)) { $error['content'] = '请检查库存格式'; echo j ...

  3. Kubernetes+Promethues+Cloud Alert实践分享

    前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...

  4. TCP中RTT的测量和RTO的计算

    https://blog.csdn.net/zhangskd/article/details/7196707 tcp传输往返时间是指:发送方发送tcp断开时, 到发送方接收到改段立即响应的所耗费的时间 ...

  5. linux 网络编程 基础

    网络编程基础 套接字编程需要指定套接字地址作为参数,不同的协议族有不同的地址结构,比如以太网其结构为sockaddr_in. 通用套接字: struct sockaddr { sa_family_t ...

  6. HttpClient4.5X使用-集成微服务

    HttpClient4.5X使用-集成微服务       1.什么是HttpClient HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直 ...

  7. python爬虫分析报告

    在python课上布置的作业,第一次进行爬虫,走了很多弯路,也学习到了很多知识,借此记录. 1. 获取学堂在线合作院校页面 要求: 爬取学堂在线的计算机类课程页面内容. 要求将课程名称.老师.所属学校 ...

  8. IP地址分类的计算方法

    IP地址由四段组成,每个字段是一个字节,8位,最大值是255,但实际中我们用点分十进制记法. IP地址由两部分组成,即网络地址和主机地址.网络地址表示其属于互联网的哪一个网络(常见ABC三类,以固定网 ...

  9. [原题复现][极客大挑战 2019]HardSQL(updatexml报错注入)

    简介  原题复现:  考察知识点:SQL注入(报错注入,绕过过滤)  线上平台:https://buuoj.cn(北京联合大学公开的CTF平台 特别感谢!) 榆林学院内可使用信安协会内部的CTF训练平 ...

  10. python-网络安全编程第五天(爬虫模块BeautifulSoup)

    前言 昨晚学的有点晚 睡得很晚了,今天早上10点多起来吃完饭看了会电视剧就瞌睡了一直睡到12.50多起来洗漱给我弟去开家长会 开到快4点多才回家.耽搁了不少学习时间,现在就把今天所学的内容总结下吧. ...