Django Web开发之model操作

model操作

model常用操作对应的就是数据库中的增删改查

参照文档https://docs.djangoproject.com/zh-hans/2.2/topics/db/models/

示例文件

from django.db import models

class Students(models.Model):
    """学生表"""
    username = models.CharField(max_length=64, null=False, unique=True)
    age = models.IntegerField()
    cls = models.ForeignKey(‘ClassInfo‘, on_delete=models.DO_NOTHING)

class ClassInfo(models.Model):
    """班级表"""
    title = models.CharField(max_length=64, null=False, unique=True)
    teachers = models.models.ManyToManyField("Teachers")

class Teachers(models.Model):
    """老师表"""
    name = models.CharField(max_length=16, null=False, unique=True)

1.单表操作

1.1增加数据

  • 第一种方式
obj = models.Students(username=‘张三‘, cls_id=‘1‘)
obj.save()
  • 第二种方式
models.Students.objects.create(username=‘张三‘, cls_id=‘1)

1.2查询数据

  • get获取
# 获取id为1的学生
models.Students.objects.get(id=‘1‘)
  • filter获取
# 查询id=1的学生
obj = models.Students.objects.filter(id=‘1‘)
# 查询年龄大于19的学生
obj = models.Students.objects.filter(age__gt=19)
# 查询年龄大于19小于22的学生
obj = models.Students.objects.filter(age__gt=19, age__lt=22)
# 查询id在[1, 3, 5, 6]的学生
obj = models.Students.objects.filter(id__in=[1, 3, 5, 6])
# 查询名字包含“伟”的学生
obj = models.Students.objects.filter(username__contains==‘伟‘)

  • all()查询所有
stu_list = models.Students.objects.all()  # 返回查询集,里面都是对象
  • vlaues
stu_list = models.Students.objects.values()   # 返回查询机,里面都是字典,不写字段,默认显示错有
  • vlaues_list
stu_list = models.Students.objects.values_list()   # 返回查询机,里面都是元组

1.3修改数据

  • update
# 修改id为1的学生的班级
obj = models.Students.objects.filter(id=‘1‘) # 通过查询找到id为1的学生
obj.update(cls_id=2) # 使用update更新该学生信息

1.4删除数据

# 修改id为1的学生的班级
obj = models.Students.objects.filter(id=‘1‘) # 通过查询找到id为1的学生
obj.delete() # 使用delete() 删除

1.5查询集

查询函数

函数名 功能 返回值 说明
get 返回表中满足条件的一条且只能有一条数据 返回值是一个模型类对象 参数中写查询条件,1)如果查到多条数据,则抛异常MultipleObjectsReturned。2)查询不到数据,则抛异常:DoesNotExist。
all 返回模型类对应表格中的所有数据。 返回值是QuerySet类型 查询集
filter 返回满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
exclude 返回不满足条件的数据。 返回值是QuerySet类型 参数写查询条件。
order_by 对查询结果进行排序。 返回值是QuerySet类型 参数中写根据哪些字段进行排序。

all, filter, exclude, order_by调用这些函数会产生一个查询集,QuerySet类对象可以继续调用上面的所有函数。

查询集特性

1)惰性查询:只有在实际使用查询集中的数据的时候才会发生对数据库的真正查询。

2)缓存:当使用的是同一个查询集时,第一次使用的时候会发生实际数据库的查询,然后把结果缓存起来,之后再使用这个查询集时,使用的是缓存中的结果。

3)可以对一个查询集进行取下标或者切片操作来限制查询集的结果, 类似列表。对一个查询集进行切片操作会产生一个新的查询集,下标不允许为负数。

2 .关联操作

2.1 一对多操作

学生和班级就是一对多关系,一个学生对应一个班级,一个班级则对应多个学生

通过学生,查找班级的title

stu_obj = model.Stuents.objects.get(id=1)
cls_title = stu_obj.cls.title

## 使用双下划线方式
cls_obj = model.Stuents.objects.filter(id=1).values_list("classinfo__title")

查询1年级1班的所有学生

cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
stu_list = cls_obj.students_set.all()

2.2 多对多操作

create

# 为1年级1班新建一名老师
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
cls_obj.teachers.create(name=‘张老师‘)

add

# 指派id为1的李老师到1年级1班
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
teacher_obj = models.Teachers.filter(id=1)
cls_obj.teachers.add(teacher_obj)
# 也可以添加多个
teacher_list = models.Teachers.filter(id__in = [1, 2, 3, 4, 5])
cls_obj.teacher.add(*teacher_list)
# 也可以直接添加id
cls_obj.teacher.add(1)

删除remove

# 从1年级1班中删除id为1的老师
cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
cls_obj.teachers.remove(1)
# 或者删除对象
teacher_obj = models.Teachers.filter(id=1)
cls_obj.teachers.remove(teacher_obj)

查询1年级1班的老师

cls_obj = models.ClassInfo.objects.filter(title=‘1年级1班‘)
teachers_list = cls_obj.teachers.all()

3.聚合与分组

聚合

聚合操作包含如下:

sum count avg max min

aggregate:调用这个函数来使用聚合。 返回值是一个字典

使用前需先导入聚合类,如下示例

from django.db.models import Sum,Count,Max,Min,Avg
# 查看有多少学生
stu_count = models.Stuents.objects.all().aggregate(Count(‘id‘))  

分组

分组使用annotate()

# 查询每个班级分配老师的数量
models.ClassInfo.objects.all().annotate(teacher_num=Count("teachers"))

原文地址:https://www.cnblogs.com/luckyleaf/p/12690405.html

时间: 2024-07-31 19:01:43

Django Web开发之model操作的相关文章

Django web开发之Form组件

Form组件使用 参照文档 https://docs.djangoproject.com/zh-hans/2.2/topics/forms/ 生成HTML标签 创建一个form类 from django import forms class RegForm(forms.Form): name = forms.CharField(max_length=6, label='用户名') pwd = forms.CharField(label='密码', min_length=8, widget=for

Web开发之RSET API

REST介绍 如果要说什么是REST的话,那最好先从Web(万维网)说起. 什么是Web呢?读者可以查看维基百科的词条(http://zh.wikipedia.org/zh-cn/Web),具体的我就不多说了.总之,Web是我们在互联网上最常用的服务,甚至在某些人的心中,互联网就是Web.当然,Web只是互联网的一部分而已,只是大家用的最多而已,我们访问的所有网站都是基于Web. 那么,Web和REST之间究竟有什么关系呢?我们接下来将聊聊组成Web的几大基础技术,URI(统一资源标识符,用来标

[Java Web] 3\WEB开发之HTML基础程序试手

1.初试: 1 <html> 2 <body> 3 <h1>My First Heading</h1> 4 <p>My first paragraph.</p> 5 </body> 6 </html> 2.标题: HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的.显然由大标题变为小标题.... 1 <html> 2 <body> 3

【Go web开发之revel+mgo】第11章 部署到heroku上

演示地址  http://gblog-revel.herokuapp.com/ 1.申请mongohq 关于如何在注册heroku和mongohq帐号,我在之前的blog里面有说明,http://blog.csdn.net/joveth/article/details/19999535 这里简单的说一下,还记得我们的models/dao.go文件里的NewDao方法中被注释的那一行吗? session, err := mgo.Dial("mongodb://omind:[email protec

HTML5+JS手机web开发之jQuery Mobile初涉

一.起始之语 我一直都是在PC上折腾网页的,这会儿怎么风向周边捣鼓起手机网页开发呢?原因是公司原先使用Java开发的产品,耗了不少人力财力,但是最后的效果却不怎么好.因为,Android系统一套东西,iPhone又是新的一套,折腾死人呐. 于是总监发狠,让我把手上的活都交出去,专心折腾web版的,看看最后效果如何. 加上我觊觎手机上的开发学习很久了,于是,一拍即合,搞起了手机开发方面的学习. 分享是很好的提高自身学习的方法.因为分享过程中梳理了所学,往往会有些意想不到的心得与收获.如此利人利已的

Web开发之django(一基础篇)

什么是web框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演.对于,所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. ############################################################################################ 基本配置一.创建dj

Web开发之MVC框架

什么是MVC框架? 在这里我简要的说明一下,想要详细的了解MVC的小伙伴们可以上百度百科,或者找来相应的书籍,仔细研究和理解一下,但是要说明的的一点是,完全理解MVC并不是一件容易的事. MVC的全称为Model View Controller,是模型-视图-控制器的缩写,一种软件框架模式,通俗点讲,就是将应用程序的输入.处理和输出进行解耦,使M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式. 简单来说一下MVC框架的三个核心部件的内容,即Model.View和Controller.

Java Web开发之Servlet、JSP基础

有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发相对繁琐,代码量庞大而且不易维护,美工无法参与界面设计开发等不足,于是就诞生了jsp.jsp是对servlet开发模型的重要升级.有了jsp,Java Web开发技术才真正被广泛使用. 一.Servlet 在Java Web开发当中,新建一个类继承(派生)自HttpServlet类即可创建一个Ser

.NET web开发之WebApi初试水

前几天看了.NET的EF(Entity Framework),发现居然有这么先进的东西,只要操作几个类就可以完成数据库的增删查改,而且可以用数据库直接导出类(DB First).也可以用类来生成数据库(Code First),简直太先进了. 之前用EF做一个API服务的网站,每次要添加一条方法就要在View来解析传来的QueryString,然后调用Controller 来执行对数据库的增删查改.其实之前就一直都是听说过WebAPI,虽然一直没用过.今天抽空查了一下,完全符合我的应用需求——AS