原文地址:https://www.cnblogs.com/rinka/p/django_make_queries_anout_built-in_lookups.html

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;

python django的查询语句相关推荐

  1. python django orm查询集总结

    1 .什么是ORM (Object Relational Mapping ) 它的作用是在关系型数据库和业务实体对象做一个映射,我们在操作具体业务对象的时候就可以省去了和SQL语句打交道,只需要简单的 ...

  2. python django 数据库查询方法总结

    __exact 精确等于 like 'aaa' __iexact 精确等于 忽略大小写 ilike 'aaa' __contains 包含 like '%aaa%' __icontains 包含 忽略 ...

  3. Python Django 惰性查询(懒加载)

  4. Python Django Q查询和F查询API

  5. Python Django 正向查询与逆向查询

  6. python语法中infile语句_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  7. python爬虫 django搜索修改更新数据_一文搞懂Django数据库查询操作

    本文略长,读完约需十分钟.当做复习笔记效果更佳. 查询操作: 数据查询是数据库操作中一个非常重要的技术.查询一般就是使用filter.exclude以及get三个方法来实现.我们可以在调用这些方法的时 ...

  8. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题

    直接给出例子说明: cs = conn.cursor() img_ids = [1,2,3] sql = "select img_url from img_url_table where i ...

  9. django 按钮的样式_【实战演练】Python+Django网站开发系列11-成绩查询与成绩录入...

    #本文欢迎转载,转载请注明出处和作者 终于做到最后一步了,选课.删除.已选展示.修改密码等功能都已经完成,剩下查询已选课程的成绩(学生界面)与成绩录入(老师界面).其中成绩查询的页面与之前做过的基本上 ...

  10. Navicat的使用,连表查询,python代码操作sql语句

    exist(了解): exist是一个表示真假值的关键字,表示是否存在,当有exist关键字时,内层查询语句不会返回结果而是返回一个真假值,如果为True,那么外层语句将继续查询,如果为假,那么外层语 ...

最新文章

  1. 浏览器获取设备信息_过滤获取日志和浏览器信息
  2. .net 2005大写html标签 xhtml10,HTML10.ppt
  3. 自动修改mysql5.7初始化密码
  4. jdk Queue抽象接口
  5. 关于springboot与freeMarker的使用
  6. 使用TF卡烧录Jetson NX开发板
  7. dtft变换的性质_DTFT及其性质
  8. java中向上的尖括号是什么_T(尖括号)在Java中是什么意思?
  9. scratch编程钟表
  10. 笔记本电脑触摸板操作
  11. YOLOv4原文翻译 - v4它终于来了!
  12. Vue3零基础学习指南之Vue基础(1)— 模板语法与指令
  13. 移动App Store测试的“七宗罪”
  14. 有一台服务器可以做哪些很酷的事情
  15. Matlab 文件重命名
  16. JavaScript 求平均数的方法(实参个数不确定)
  17. C语言的指南针——指针与结构体
  18. pyqt tablewidget 设置一行的背景_PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现...
  19. FTP 错误 550 Failed to change directory 记录贴
  20. 对于Automatic Multi-Sensor Extrinsic Calibration for Mobile Robots的标定方案分析总结

热门文章

  1. 程序员养生-人体白发的机制及治疗、调养恢复
  2. 多ubuntu主机远程桌面连接方案
  3. qPCR定量方法在肠道微生物特定种属定量应用
  4. 解决NUC8豆子峡谷装黑苹果键盘错位的设置
  5. 批量修改pdf文件名称(一)
  6. PaddleDetection 自定义VOC数据集进行目标检测
  7. 2022年危险化学品经营单位安全管理人员报名考试及危险化学品经营单位安全管理人员复审模拟考试
  8. 异地如何在北京换驾照
  9. debian 安装teamviewer
  10. 只有mdf文件恢复数据库