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查询操作
查询操作是Django的ORM框架中最重要的内容之一.我们建立模型.保存数据为的就是在需要的时候可以查询得到数据.Django自动为所有的模型提供了一套完善.方便.高效的API,一些重要的,我们要背下 ...
- Django查询SQL语句
Django查询SQL语句 # 1 res=models.Book.objects.all() # print(res)#<QuerySet [<Book: Book object> ...
- Django查询数据库性能优化
现在有一张记录用户信息的UserInfo数据表,表中记录了10个用户的姓名,呢称,年龄,工作等信息. models文件 from django.db import models class Job(m ...
- django查询数据库无法过滤月份的解决
我试过,当settings里的:USE_TZ = False时也可以查询,但是数据库里的时间就会显示错的 解决方法是可以再终端输入 mysql_tzinfo_to_sql /usr/share/zon ...
- django 查询如何使用 or
参考:http://stackoverflow.com/questions/6567831/how-to-perform-or-condition-in-django-queryset django自 ...
- 关于Django查询知识点总结
========关于Django查询知识点总结======= models.Book.objects.filter(**kwargs): querySet [obj1,obj2] models.Boo ...
- mysql-数据库查询语句汇总
目录 数据库查询语句 ***** 添加数据补充: 所有的select 关键字 where 条件 distinct 去除重复记录 指定字段 取别名 group by having order limit ...
- SQL Server-简单查询语句,疑惑篇(三)
前言 对于一些原理性文章园中已有大量的文章尤其是关于索引这一块,我也是花费大量时间去学习,对于了解索引原理对于后续理解查询计划和性能调优有很大的帮助,而我们只是一些内容进行概括和总结,这一节我们开始正 ...
- thinkphp中的查询语句
<?php namespace Admin\Controller; use Think\Controller; class MainController extends Controller { ...
- Oracle 查询语句(where,order by ,like,in,distinct)
select * from production;alter table production add productionprice number(7,2); UPDATE production s ...
随机推荐
- html&&css 基础知识笔记
diV有 Class.Style.title.ID 等属性. 1.margin 空出边缘 margin:上 下 左 右(按顺时针顺序,缺少某一方向则对称) 2.border 边框(三要素:像素 形状 ...
- 关键词匹配(Ac自动机模板题)
2772: 关键词匹配 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 10 Solved: 4[Submit][Status][Web Board] ...
- Python3基础 setdefault() 根据键查找值,找不到键会添加
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...
- robotium从入门到放弃 四 Robotium常用API
获取控件 getText() getEditText() getButton() getImage() getImageButton() getEditText() getView() getWe ...
- PHP使用array_intersect()函数求数组交集
在PHP中求数组的交集,我们可以与PHP给我们提供的现成函数:array_intersect(),其用法格式为: array array_intersect(array array1,array ar ...
- iOS 项目上线流程
一.证书的导出 1.1 前期工作 首先你需要有一个苹果的开发者帐号,一个Mac系统. 如果没有帐号可以在打开http://developer.apple.com/ ...
- mySQL内存及虚拟内存优化设置
为了装mysql环境测试,装上后发现启动后mysql占用了很大的虚拟内存,达8百多兆.网上搜索了一下,得到高人指点my.ini.再也没见再详细的了..只好打开my.ini逐行的啃,虽然英文差了点,不过 ...
- origin从图中获得数据
有Origin的原图,即利用Origin的"copy page"功能直接拷贝到文字处理软件的数据图,对于这种图,双击用Origin打开后,双击要导出数据的权限,打开"pl ...
- HDU-1995-汉诺塔V
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1995 这题不知道该说水还是不水,对于这题我看到题目数据,就有了想法,因为题目数据给的好 所以我直接 假 ...
- hadoop-1.x的运行实例
我的环境是hadoop-0.20.2,eclipse:SDK-3.3.2, 源数据为: Apr 23 11:49:54 hostapd: wlan0: STA 14:7d:c5:9e:fb:84 Ap ...