Django中的增删改查
1.model
假设我们的model如下:
某个JobType下有很多Job。
class JobType(models.Model):
name = models.CharField(max_length=10)
description = models.CharField(max_length=100, null=True, blank=True) def __str__(self):
return self.name
class Job(models.Model):
name = models.CharField(max_length=50)
type = models.ForeignKey(JobType, related_name='jobs')
city = models.CharField(max_length=30)
experience = models.CharField(max_length=15)
education = models.CharField(max_length=10)
salary = models.CharField(max_length=15)
public_time = models.DateTimeField() def __str__(self):
return self.name
2.查询
2.1 查询所有JobType
In [1]: JobType.objects.all()
Out[1]: [<JobType: Java>, <JobType: Python>, <JobType: PHP>]
对上述的queryset按名字排序(逆序则在字段前加减号‘-’,如order_by('-name') )
In [2]: JobType.objects.all().order_by('name')
Out[2]: [<JobType: Java>, <JobType: PHP>, <JobType: Python>]
2.2 查询name为‘Python’的JobType( 注意用get()方法得到的是单个对象而不是queryset,若有多个对象满足条件应该使用filter()方法。 )
In [3]: JobType.objects.get(name='Python')
Out[3]: <JobType: Python>
注意:1)若get()返回多个对象,会引发异常 MultipleObjectsReturned
2)若没有对象符合查询条件,会引发异常 DoseNotExist,如:
JobType.objects.get(id=100) # raises JobType.DoesNotExist
2.3 查询所有JobType的name为Python的Job
In [4]: type = JobType.objects.get(name='Python')
In [5]: Job.objects.filter(type=type)
Out[5]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
由于我们在Job model中定义type外键时,定义了related_name=‘jobs’,故还能用下面的方法查询
In [6]: type = JobType.objects.get(name='Python')
In [7]: type.jobs.all()
Out[7]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
当然,我们也可以用一条语句完成这个查询。就是下面的跨表查询,即外键 + 两条下划线 + 另一个表的字段:fk__field-in-foreign-model
In [8]: Job.objects.filter(type__name='Python')
Out[8]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
2.4 查询JobType的name为‘Python’之外的所有Job
In [9]: Job.objects.all().exclude(type__name='Python')
Out[9]: [<Job: PHP/高级PHP工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP开发>, <Job: PHP>, <Job: PHP工程师>, <Job: PHP工程师>, <Job: PHP>, <Job: PHP研发工程师>, <Job: PHP开发工程师>, <Job: PHP>, <Job: PHP>, <Job: PHP开发工程师>, <Job: 高级PHP开发工程师>, <Job: PHP高级工程师>]
3.django内置的查询字段
语法为字段 + 两条下划线 + 内置查询字段:field__bulit-in
3.1 gt(gte): 大于(大于等于)
查询id > 2的JobType:
In [9]: JobType.objects.filter(id__gt=2)
Out[9]: [<JobType: PHP>]
相当于sql语句:
SELECT ... WHERE id > 2;
类似的还有 lt(lte): 小于(小于等于)
3.2 in
查询id为1,3的JobType:
In [10]: JobType.objects.filter(id__in=[1,3])
Out[10]: [<JobType: Java>, <JobType: PHP>]
相当于sql语句:
SELECT ... WHERE id IN (1, 3);
3.3 range 常用来筛选出属于某个连续区间的对象
查询id在1~3范围内的所有JobType:
In [11]: JobType.objects.filter(id__range=(1,3))
Out[11]: [<JobType: Java>, <JobType: Python>, <JobType: PHP>]
相当于sql语句:
SELECT ... WHERE id BETWEEN 1 and 3;
3.4 contains 包含‘xxx’(大小写敏感),常用于找出包含某些关键字的对象
查询type名字包含“python”的Job:
In [12]: Job.objects.filter(type__name__contains='python')
Out[12]: []
相当于sql语句:
SELECT ... WHERE name LIKE '%python%';
类似的有icontains (大小写不敏感)。注意contains是大小写敏感的,icontains是大小写不敏感的。对比如下:
In [13]: Job.objects.filter(type__name__icontains='python')
Out[13]: [<Job: Python开发工程师>, <Job: Python开发工程师>, <Job: python软件工程师>, <Job: Python>, <Job: Python开发>, <Job: Python>, <Job: Java/Python>, <Job: 大数据开发工程师JAVA、Scala、Python>, <Job: python开发工程师>, <Job: Python>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python工程师>, <Job: Python>, <Job: Python/PHP 语言开发工程师-YL>, <Job: Python工程师>, <Job: Python工程师(中高级)>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, '...(remaining elements truncated)...']
3.5 startswith 以‘xxx’开头(大小写敏感)
In [14]: Job.objects.filter(name__startswith='高级')
Out[14]: [<Job: 高级python研发工程师>, <Job: 高级Python工程师>, <Job: 高级python开发>, <Job: 高级python工程师>, <Job: 高级python开发>, <Job: 高级python工程师>, <Job: 高级Python工程师>, <Job: 高级Python工程师>, <Job: 高级python开发工程师>, <Job: 高级Python工程师>, <Job: 高级工程师-Python>, <Job: 高级python工程师>, <Job: 高级Python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级python工程师>, <Job: 高级Python工程师>, <Job: 高级python开发工程师>, <Job: 高级Python开发工程师>, <Job: 高级python开发工程师>, '...(remaining elements truncated)...']
相当于sql语句:
SELECT ... WHERE name LIKE '高级%';
类似的有istartswith (大小写不敏感)
3.6 endswith 以‘xxx’结尾(大小写敏感)
类似的有iendswith (大小写不敏感)
3.7 regex 正则(大小写敏感)
找出city以‘北京’或者‘上海’开头的Job:
In [15]: Job.objects.filter(city__regex=r'^(上海|北京)')
Out[15]: [<Job: Python开发工程师>, <Job: Python>, <Job: Python开发>, <Job: Python研发高级工程师>, <Job: Python开发>, <Job: Python后台开发工程师>, <Job: python web开发实习生>, <Job: Python开发>, <Job: python实习生>, <Job: python工程师>, <Job: python/django开发工程师>, <Job: python工程师>, <Job: 资深Python开发>, <Job: Python>, <Job: Python工程师/实习生--无人车方向>, <Job: Python>, <Job: python高级工程师>, <Job: Python开发>, <Job: python工程师>, <Job: python开发(校招)>, '...(remaining elements truncated)...']
类似的有iregex (大小写不敏感)
3.8 和DateTime字段相关的内置查询字段
date 使用date类型的值
year 使用整数来表示年份
month 使用整数1~12来表示12个月份
day 使用整数来表示日
week_day 使用整数1~7来表示星期几(其中1为星期日)
hour 使用整数0~23来表示24小时
minute 使用整数0~59来表示分钟
second 使用整数0~59来表示秒钟
比如查询在2017年2月14日之后发布的Job:
Job.objects.filter(public_time__date__gt=datetime.date(2017,2,14))
查询2017年1月份发布的Job:
Job.objects.filter(public_time__year=2017, public_time__month=1)
3.9 isnull 可设置为True或者False,用来筛选某字段 为NULL / 不为NULL 的对象
In [16]: JobType.objects.filter(description__isnull=True)
Out[16]: [<JobType: Java>, <JobType: PHP>]
相当于sql语句:
SELECT ... WHERE description IS NULL;
Django中的增删改查的更多相关文章
- Django中ORM增删改查
新建模型 class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max ...
- Django ORM 数据库增删改查
Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...
- 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查
原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...
- Django数据库操作(增删改查)
Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...
- winform窗体(六)——DataGridView控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- Winform(DataGridView)控件及通过此控件中实现增删改查
DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定: List<xxx> list = new List<xxx> ...
- DataGridView中进行增删改查
首先我们需要知道是在哪个数据库中的哪个表进行增删改查: 这就需要我们: 建立给连接服务器的类:(可以在方法类中建立) 建立一个对列名进行封装的类:方便数据之间的传接:(学到Linq-sql时这些就简便 ...
- SQLite中的增删改查
虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作. 首先是建立一个类,继承SQLiteOpenHelper 这里面会建立一个数据库,并且初始化一个表 ...
- “造轮运动”之 ORM框架系列(一)~谈谈我在实际业务中的增删改查
想想毕业已经快一年了,也就是大约两年以前,怀着满腔的热血正式跨入程序员的世界,那时候的自己想象着所热爱的技术生涯会是多么的丰富多彩,每天可以与大佬们坐在一起讨论解决各种牛逼的技术问题,喝着咖啡,翘着二 ...
随机推荐
- ssh保持长连接的方式
方法有以下三种:1.修改server端的etc/ssh/sshd_configClientAliveInterval 60 #server每隔60秒发送一次请求给client,然后client响应,从 ...
- glibc库和glib库
http://ftp.acc.umu.se/pub/GNOME/sources/ ubuntu16上glib的安装包的名是libglibXX XX是版本号 ubuntu上查看glibc的方法 ldd ...
- springboot-3-web开发
一.视图层技术thymeleaf 我们一般都是基于3.x版本 1.流程: 导入依赖 <!--整合thymeleaf技术--> <dependency> <groupId& ...
- 【排序+模拟】魔法照片 luogu-1583
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- 大数据学习(06)——Ozone介绍
前面几篇文章把Hadoop常用的模块都学习了,剩下一个新模块Ozone,截止到今天最新版本是0.5.0Beta,还没出正式版.好在官方网站有文档,还是中文版的,但是中文版资料没有翻译完整,我试着把它都 ...
- Linux扩展分区和文件系统
磁盘分区 linux也与windows一样,为了使用全部的磁盘空间,需要先对磁盘分区:如果所有分区的总容量小于磁盘容量,说明磁盘还有未分配空间,这个时候会对磁盘造成浪费.需要增加一个新的分区来将全部空 ...
- ssrf漏洞随笔
一.ssrf漏洞定义 SSRF漏洞:SSRF是一 种由攻击者构造请求,由服务端发起请求的安全漏洞.一般情况下,ssrf攻击的目标是外网无法访问的内部系统 SSRF漏洞( 服务器端请求伪造 )也被称为跨 ...
- Python语法之用户交互与基本运算符
一.与用户交互 1.接收用户输入 python3中的input会把用户输入的所有内容都存成str类型 age = input("请输入您的年龄: ") # "内容&quo ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案
2021字节跳动校招秋招算法面试真题解题报告--leetcode19 删除链表的倒数第 n 个结点,内含7种语言答案 1.题目描述 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. ...
- 面试反杀「GitHub 热点速览 v.21.33」
作者:HelloGitHub-小鱼干 作为一个应聘者,面试的时候经常会被面试官问:你有什么问题要问我吗?为了避免这种临时想不到问题的尴尬,reverse-interview-zh 会教你下反向操作,提 ...