Django框架之ORM的相关操作(一)
一、一般操作
from django.db import models
import datetime # Create your models here. class Author(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=20)
# 以下是测试字段
numtest=models.IntegerField()
datetest=models.DateField(null=False,default=datetime.datetime(year=2000,month=1,day=1)) def __str__(self):
return "名字:%s,数字:%d,日期:%s" %(self.name,int(self.numtest),self.datetest)
# 设置创建的表名
class Meta:
db_table="person"
以上是模型类,按照这个模型类进行记录相关操作
(1)all() 查询所有结果
通过遍历获取每个值
(2)filter(**kwargs) 根据指定条件获取对象,get(**kwargs) 根据指定条件获取对象
区别:filter方法是根据指定条件获取所有的匹配对象,如果没有获取匹配的对象,那么就返回空列表;get方法是根据指定对象获取唯一的值,如果存在大于1条或者0条数据时,get方法就会报错
(3)exclude(**kwargs) 获取所选条件不匹配对象
(4)values(*filed) 返回一个元素是字典的列表对象,返回所有对象;filed参数是指定显示的字段,如果不指定则显示全部字段。
(5)values_list(*field) 返回元素是元组的列表,返回所有的值,使用方法和values()类似
(6)order_by(*filed) 将所有查询出来的对象按照条件进行排序
(7)order_by(*filed).reverse() 反向排序
(8)distinct() 从返回结果中剔除重复的记录
(9)count() 返回查询结果的数量
(10)first() 查询第一条数据
(12)last() 返回查询出来的数据,取最后一条数据
(13)exists() 返回结果不为空返回True,否则返回False
================================================================================================
二、单表查询之双下划线
模型类
class Student(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=10)
age=models.IntegerField(default=0) classes=models.ForeignKey(to="Classes",on_delete=models.CASCADE) class Meta:
db_table="stu" def __str__(self):
return "{}:{}".format(self.id,self.name) class Classes(models.Model):
id=models.AutoField(primary_key=True)
cls=models.CharField(max_length=20) class Meta:
db_table="cls" def __str__(self):
return "{}:{}".format(self.id,self.cls)
(1)id__gt=5 表示id大于5,id_lt=10 表示id小于10 (字段是数字类型的,可以这样使用,比如age字段是数字类型,那么就可以使用age_gt=20表示年龄大于20)
(2)id__in=[4,5,6] 表示id=4,5,6的
表示查询id不是4,5,6
(3)name__contains="王" 表示字段是name中包含王字的信息
(4)name__icontains="M" 表示字段是name中包含m的信息,不区分大小写
(5)id__range=[2,5] 表示查询id在2到5的信息
(6)name_startswith="A" 表示字段name是以A开头的信息
(7)name_istartswith="a" 表示字段name是以a开头的信息,不区分大小写
(8)name_endswith="A" 表示字段name是以A结尾的信息
(9)name_iendswith="A" 表示字段name是以A结尾的信息,不区分大小写
================================================================================================
三、ForeignKey操作(一对多)
(1)正向查询1(通过对象查询)
对象.关联字段.字段
例如:通过图书获取出版社名称
使用get方法获取到的是一个模型类的对象,只需要使用对象.关联字段.字段就可以获取到。
而filter方法获取到的是一个QuerySet对象,也就是一个列表,取出需要的信息,通过索引取到,所以可以使用对象[i].关联字段.字段。或者可以使用遍历循环将每个对象获取到,然后再对象.关联字段.字段。
(2)正向查询2(通过字段查询)
关联字.字段
(3)反向查询之方法一
表:Student(学生表,学生信息表示多,有外键),Classes(教室表,教室表信息表示一,没有外键)
反向查询表示通过一查询多,也就是通过教室表的某个教室查询出所对应的信息
语法:1.获取到某个教室的对象 2.教室信息.学生表小写_set.all()
(4)反向查询之方法二
=======================================================================================
四、多对多表的相关操作
# 查询id=3的作者写过的全部的书
author = models.Author.objects.get(id=3)
books1=author.book.all()
create() 创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。
# 通过作者创建一本书,自动保存
# 做了两件事:1.在book表中创建一本新书,2,在作者和书的关系表中添加关联记录
author = models.Author.objects.get(id=2)
author.book.create(name="python成长之路")
add() 把指定的model对象添加到关联对象集中
# 将已存在的作者和书籍关联起来
author = models.Author.objects.get(id=2)
book2=models.Books.objects.get(id=2)
author.book.add(book2)
# 将已存在的作者和书籍关联起来(批量关联)
author = models.Author.objects.get(id=2)
book3=models.Books.objects.all()
author.book.add(*book3)
remove() 从关联对象集中移除执行的model对象
# 删除作者和书籍关联起来的某一条记录,例如:删除作者id是3,书的id是7的记录
get_author=models.Author.objects.get(id=3)
get_author.book.remove(7)
clear() 从关联对象集中移除一切对象。
# 删除某个作者下的所有书籍关联起来的记录,例如:删除作者id是3下的所有书籍
get_author=models.Author.objects.get(id=3)
get_author.book.clear()
set() 更新model对象的关联对象
book_obj = models.Book.objects.first()
book_obj.authors.set([2, 3])
====================================================================
外键的反向操作
更新了模型类
from django.db import models # Create your models here. class Author(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=10)
book=models.ManyToManyField(to="Books") class Books(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=20) book_publisher=models.ForeignKey(
to="Publisher",
null=True,
on_delete=models.CASCADE,
related_name="publisher_book"
) class Publisher(models.Model):
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=20)
# 外键的反向操作
# 查询出版社下的所有图书 出版社:多 图书:一 外键添加在图书类中
get_publisher=models.Publisher.objects.get(id=1)
get_books=get_publisher.publisher_book.all()
books_list=[]
for b in get_books:
books_list.append(b.name)
print(books_list )
# 删除出版社id=1下的所有图书(相当于将外键的指向删除)
get_publisher=models.Publisher.objects.get(id=1)
get_publisher.publisher_book.clear()
Django框架之ORM的相关操作(一)的更多相关文章
- Django框架之ORM的相关操作之分页(六)
分页是每个项目必不可少要写的一个功能,该篇文章就将记录一下使用ORM写分页的过程. 假设我们的数据库里面需要显示一些数据,而这个表中的数据大约有几千条数据,那么我们不可能将所有的数据都显示出来,那么就 ...
- Django框架之ORM的相关操作之多对多三种方式(五)
在之前的博客中已经讲述了使用ORM的多对多关系表,现在进行总结一下: 1.ORM自动帮助我们创建第三张表 2.手动创建第三张表,第三张表使用ForeignKey指向其他的两张表关联起来 3.手动创建第 ...
- Django框架之ORM的相关操作之一对一关系(四)
ORM中一对一在当一张表的某一些字段查询的比较频繁,另外一些字段查询的不是特别频繁,那么就把不常用的字段单独拿出来做成一张表,然后通过一对一进行关联起来.举个例子:在我们登录某个账户的时候,一般会显示 ...
- Django框架之ORM的相关操作(二)
模型类: class Commongity(models.Model): id=models.AutoField(primary_key=True) name=models.CharField(max ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
- Django框架之ORM对表结构操作
ORM的优点:(1)简单,不用自己写SQL语句 (2)开发效率高 ORM的缺点:对于不同的人写的代码,执行效率有差别 ORM的对应关系: 类 ----------> 数据表 对象------ ...
- django框架基础-ORM跨表操作-长期维护
############### 一对一跨表查询 ################ import os if __name__ == '__main__': os.environ.setde ...
- django框架基础-ORM单表操作-长期维护
############### 单表操作-添加数据 ################ import os if __name__ == '__main__': os.environ.set ...
随机推荐
- 腾讯云COS对象存储
一.腾讯云COS 腾讯云对象存储 COS 是一种存储海量数据的分布式存储服务.COS 提供了多种对象的存储类型:标准存储.低频存储.归档存储. 二.为什么要使用TA 便宜: 个人用户有6个月的免费使用 ...
- 模块一:shell 脚本基础
一.shell脚本介绍 (一)脚本案例及介绍: #!/bin/bash LOG_DIR=/var/log ROOT_UID=0 if ["$UID -ne "$ROOT_UID&q ...
- 虫师自动化测试robot Framework 框架的学习2
循环的使用 1.in range和in的区别 输出结果 如果把上面的换成in range 会报错 未被定义,说明in range 后面使用的数据类型有限制,对比下,可以看出,in 可用在列表类型数据类 ...
- 【18】 递归 X的N次幂
题目(我没想到这也能出成题目--) 实现函数double Power(double base, int exponent),求base的exponent次方.不得使用库函数,同时不需要考虑大数问题. ...
- RFC3984: RTP Payload Format for H.264 Video(中文版)
转载地址:https://blog.csdn.net/h514434485/article/details/51010950 官方文档,中文版本地址:http://www.rosoo.net/File ...
- codeforces 1288C. Two Arrays(dp)
链接:https://codeforces.com/contest/1288/problem/C C. Two Arrays 题意:给定一个数n和一个数m,让构建两个数组a和b满足条件,1.数组中所有 ...
- keil里面的包
1.使用Keil开发STM32程序时,需要下载STM32固件包 首先,keil就是一个编辑器,就跟记事本一样. 但keil还可以编译链接程序. 在创建一个工程时,要选择芯片序列. 要选择芯片序列的原因 ...
- 2.9 log4j 在测试过程中打印执行日志
Apache Log4j配置说明/log4j的分层打印 http://blog.csdn.net/zzy7075/article/details/53763728
- 后缀数组 poj 3415
首先,height[i]-k+1 很好理解把,他是说明目前这对后缀中不小于k的公共子串个数. 题解说用单调栈维护,为什么要用单调栈维护呢?因为时间复杂的可以大大降低. 怎么个降低方法呢? 在之前学习 ...
- zabbix4.2安装配置指南
[声名]本实例中采用Linux CentOS 7系统 CentOS Linux release 7.6.1810 (Core) 1.安装LAMP环境: [root@localhost /]# yum ...