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中的增删改查的更多相关文章

  1. Django中ORM增删改查

    新建模型 class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max ...

  2. Django ORM 数据库增删改查

    Django ORM 数据库增删改查 增 # 创建.增加数据(推荐) models.UserInfo.objects.create(username=') # 创建.增加数据 dic = {'} mo ...

  3. 【设计模式】【应用】使用模板方法设计模式、策略模式 处理DAO中的增删改查

    原文:使用模板方法设计模式.策略模式 处理DAO中的增删改查 关于模板模式和策略模式参考前面的文章. 分析 在dao中,我们经常要做增删改查操作,如果每个对每个业务对象的操作都写一遍,代码量非常庞大. ...

  4. Django数据库操作(增删改查)

    Django数据库操作(增删改查) 创建数据库中的一个表 class Business(models.Model): #自动创建ID列 caption = models.CharField(max_l ...

  5. winform窗体(六)——DataGridView控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  6. Winform(DataGridView)控件及通过此控件中实现增删改查

    DataGridView:显示数据表,通过此控件中可以实现连接数据库,实现数据的增删改查 一.后台数据绑定:    List<xxx> list = new List<xxx> ...

  7. DataGridView中进行增删改查

    首先我们需要知道是在哪个数据库中的哪个表进行增删改查: 这就需要我们: 建立给连接服务器的类:(可以在方法类中建立) 建立一个对列名进行封装的类:方便数据之间的传接:(学到Linq-sql时这些就简便 ...

  8. SQLite中的增删改查

    虽然android提供了sql查询的封装方法,但是理解起来还是麻烦,所以我这里用sql语句来完成工作. 首先是建立一个类,继承SQLiteOpenHelper 这里面会建立一个数据库,并且初始化一个表 ...

  9. “造轮运动”之 ORM框架系列(一)~谈谈我在实际业务中的增删改查

    想想毕业已经快一年了,也就是大约两年以前,怀着满腔的热血正式跨入程序员的世界,那时候的自己想象着所热爱的技术生涯会是多么的丰富多彩,每天可以与大佬们坐在一起讨论解决各种牛逼的技术问题,喝着咖啡,翘着二 ...

随机推荐

  1. Emoji.voto,Linkerd 服务网格(service mesh)的示例应用程序

    一个微服务应用程序,允许用户为他们最喜欢的表情符号(emoji)投票,并跟踪排行榜上收到的投票.愿最好的 emoji 获胜. 该应用程序由以下 3 个服务组成: emojivoto-web:Web 前 ...

  2. MQTT 4 ——MQTT的Spring Mvc 配置接收字节流数据

    本篇记录一下MQTT整合Spring Mvc配置直接收发字节流数据 设备方是纯C开发,并且为了交互数据的安全,将传送的数据用了AES CBC进行了加密. 接下来正常方便做法应该是 将加密后的字节流转换 ...

  3. ES6 对象定义简写及常用的扩展方法

    1.ES6 对象定义简写 es6提供了对象定义里的属性,方法简写方式: 假如属性和变量名一样,可以省略,包括定义对象方法function也可以省略 <script type="text ...

  4. Python多线程爬取某网站表情包

    # 爬取网络图片import requestsfrom lxml import etreefrom urllib import requestfrom queue import Queue # 导入队 ...

  5. P3312 数表

    P3312 数表 题意 求出 \[\sum_{i=1}^n\sum_{j=1}^m\sigma(\gcd(i,j))[\sigma(\gcd(i,j))\le a] \] 其中 \(\sigma\) ...

  6. 渗透测试思路 - CTF(番外篇)

    渗透测试思路 ​ Another:影子 (主要记录一下平时渗透的一些小流程和一些小经验) CTF(番外篇) ​ 笔者是一个WEB狗,更多的是做一些WEB类型题目,只能怪笔者太菜,哭~~ 前言 ​ 本篇 ...

  7. ECShop 2.x/3.x SQL注入/任意代码执行漏洞

    poc地址:https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md 生 ...

  8. 【动画消消乐|CSS】调皮逃跑的小方块 077

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

  9. CVE-2018-12613总结

    1.漏洞基础介绍 1.1漏洞背景 phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此We ...

  10. Java数组04——多维数组

    多维数组  package array; ​ public class ArrayDemon06 {     public static void main(String[] args) {      ...