Django--filter(**kwargs)
Django--filter(**kwargs)-exclude(**kwargs)
filter()
说明:
- 数据的过滤
- 返回Queryset包含与给定查找参数匹配的新对象。这里需要特别注意的地方就是返回的是一个对象,并且当符合条件是多个的时候可以对其进行遍历。
实例测试:
首先是我们的模型类:
from django.db import models # Create your models here. class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField() def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField() def __str__(self):
return self.name class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField() # 发表时间
mod_date = models.DateField() # 更新时间
authors = models.ManyToManyField(Author)
n_comments = models.IntegerField()
n_pingbacks = models.IntegerField()
rating = models.IntegerField() def __str__(self):
return self.headline
模型类
对数据库的数据进行添加:
mysql> mysql> select * from queryset_demo_blog;
+----+-----------------+------------------------------+
| id | name | tagline |
+----+-----------------+------------------------------+
| 1 | change_new_name | All the latest Beatles news. |
| 2 | create_test | This is the wayof create |
| 3 | Cheddar Talk | One to Many test |
| 4 | blog_3 | this is a test |
+----+-----------------+------------------------------+
4 rows in set (0.07 sec) mysql> mysql> select * from queryset_demo_author;
+----+-------+---------------+
| id | name | email |
+----+-------+---------------+
| 1 | Tom | Tom@123.com |
| 2 | Jone | jone@123.com |
| 3 | Kevin | kevin@123.com |
| 4 | Joe | |
| 5 | John | |
| 6 | Paul | |
| 7 | Tom | Tom@456.qq |
| 8 | Tom | 123@qq.com |
+----+-------+---------------+
8 rows in set (0.00 sec) mysql> select * from queryset_demo_entry;
+----+-------------+----------------+------------+------------+------------+-------------+--------+---------+
| id | headline | body_text | pub_date | mod_date | n_comments | n_pingbacks | rating | blog_id |
+----+-------------+----------------+------------+------------+------------+-------------+--------+---------+
| 1 | python | This is a demo | 2018-07-11 | 2018-07-14 | 10 | 29 | 23 | 4 |
| 2 | python | django | 2018-07-12 | 2018-07-28 | 2 | 2 | 2 | 2 |
| 3 | python-2017 | djagoddd | 2017-06-01 | 2017-08-14 | 55 | 676 | 88 | 3 |
| 4 | python-2017 | django-ll | 2017-03-14 | 2017-07-14 | 22 | 33 | 44 | 1 |
| 5 | python-2015 | ddd | 2015-07-14 | 2015-07-14 | 33 | 33 | 33 | 1 |
| 6 | python-2014 | ddd | 2014-07-14 | 2014-07-14 | 22 | 33 | 33 | 3 |
| 7 | python-4 | ddd | 2014-07-14 | 2018-07-04 | 66 | 66 | 66 | 4 |
+----+-------------+----------------+------------+------------+------------+-------------+--------+---------+
7 rows in set (0.00 sec) mysql> select * from queryset_demo_entry_authors;
+----+----------+-----------+
| id | entry_id | author_id |
+----+----------+-----------+
| 1 | 1 | 2 |
| 2 | 1 | 4 |
| 3 | 1 | 5 |
| 4 | 1 | 6 |
+----+----------+-----------+
4 rows in set (0.00 sec)
数据库的数据进行添加
获取在2017年发布的博客:
>>> Entry.objects.filter(pub_date__year=2017) #这里注意双下划线的用法
<QuerySet [<Entry: python-2017>, <Entry: python-2017>]>
# 使用manage的方式进行查询 返回的是一个查询集合该查询集合可以进行遍历和切片
>>> Entry.objects.all().filter(pub_date__year=2017)
<QuerySet [<Entry: python-2017>, <Entry: python-2017>]>
exclude()
说明:
1. 数据过滤,和filter基本上有相同的功能,但是需要注意的一点就是他是返回不匹配的结果。
返回不是2017年发布的博客内容:
>>> Entry.objects.all().exclude(pub_date__year=2017) <QuerySet [<Entry: python>, <Entry: python>, <Entry: python-2015>, <Entry: python-2014>, <Entry: python-4>]>
>>> Entry.objects.exclude(pub_date__year=2017) <QuerySet [<Entry: python>, <Entry: python>, <Entry: python-2015>, <Entry: python-2014>, <Entry: python-4>]> 结合数据库中的数据
串联的使用对数据进行过滤:
>>> import datetime
>>>Entry.objects.filter(headline__startswith="python").exclude(pub_date__gte=datetime.date.today()).filter(pub_date__gte=datetime.date(2005, 1, 30))# __startswith 表示以什么开头
# 返回的查询集
<QuerySet [<Entry: python>, <Entry: python>, <Entry: python-2017>, <Entry: python-2017>, <Entry: python-2015>, <Entry: python-2014>, <Entry: python-4>]>
QuerySet的一些特性:
1.各自独立,就比如上面中的例子串联的使用其中的每一个filter()都是一个独立的QuerySet对象。相互之间没有直接的关系,相互之间没有影响,可以存储,可以使用,可以重用。
2.延迟加载,并不是每一次调用filter()方法就会去查询一次数据库,只有在真正需要数据的时候才会去查询数据库,比如:
>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
总之看这个例子看似是对数据库进行了三次查询。但是实际上只是最后一行才和数据库进行交互。
获取一个单独的对象get()
注意:get()和filter()在使用过程中是存在差异的。就是返回值的问题
当我们查询的数据不存在的时候:
- get() 会抛出异常 DoesNotExist 所以我们这里需要特别的注意。
>>> Entry.objects.get(pk=100)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/lee/PycharmProjects/Djdemo/venv/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/lee/PycharmProjects/Djdemo/venv/lib/python3.5/site-packages/django/db/models/query.py", line 403, in get
self.model._meta.object_name
queryset_demo.models.DoesNotExist: Entry matching query does not exist.
get() 异常
- filter()在使用的过程中当我们过滤的条件不存在的时候,会返回<QuerySet [ ]>
>>> Entry.objects.filter(pk=100)
<QuerySet []>
返回空查询集
QuerySet的切片:
返回前5个对象:
>>> data = Entry.objects.all()[0:5]
>>> [d.id for d in data]
[1, 2, 3, 4, 5] # 返回前5个对象
返回 6-10 个对象:
>>> data = Entry.objects.all()[3:5]
>>> [d.id for d in data]
[4, 5]
注意:
不支持负索引
>>> Entry.objects.all()[-1]
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/home/lee/PycharmProjects/Djdemo/venv/lib/python3.5/site-packages/django/db/models/query.py", line 286, in __getitem__
"Negative indexing is not supported."
AssertionError: Negative indexing is not supported.
带有步长的切片:
>>> Entry.objects.all()[0:5:2] # 使用步长 获取前五个数据 步长为2
[<Entry: python>, <Entry: python-2017>, <Entry: python-2015>]
>>> data = Entry.objects.all()[0:5:2] >>> [d.id for d in data] # 返回数据的id
[1, 3, 5]
简单的过滤order_by():
>>> data = Entry.objects.order_by('id')
>>> [d.id for d in data]
[1, 2, 3, 4, 5, 6, 7]
>>> data = Entry.objects.order_by('-id')
>>> [d.id for d in data]
[7, 6, 5, 4, 3, 2, 1]
获取单个的对象使用简单的索引:
>>> entry_obj = Entry.objects.order_by('-id')[0]
>>> entry_obj
<Entry: python-4>
>>> type(entry_obj)
<class 'queryset_demo.models.Entry'>
>>> QuerySet_obj = Entry.objects.order_by('-id')[0:1]
>>> QuerySet_obj
<QuerySet [<Entry: python-4>]>
>>> type(QuerySet_obj)
<class 'django.db.models.query.QuerySet'>
>>> QuerySet_obj = Entry.objects.order_by('-id')[0:1].get()
>>> QuerySet_obj
<Entry: python-4>
#上下等价
>>> Entry.objects.order_by('-id')[0]
<Entry: python-4>
两种方式获取同一个对象
Django--filter(**kwargs)的更多相关文章
- Django filter中用contains 在mysql中的问题
用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...
- django filter or 多条件查询
功能:django中实现多条件查询 或关系: from django.db.models import Q return qs.filter(Q(notice_to_group__contains=' ...
- 【Python】Django filter 如何支持 or 条件过滤?
from django.db.models import Q Item.objects.filter(Q(creator=owner) | Q(moderated=False)) 代码示例: if(r ...
- Django模版中的过滤器详细解析 Django filter大全
就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...
- 关于Django ORM filter方法小结
django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...
- django中的objects.get和objects.filter方法的区别
为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, defa ...
- django model的get和filter方法的区别
django的get方法: 1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. 2如果你用django的get去取得关联表的数据的话,而关键表的数据 ...
- Python攻关之Django(一)
课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...
- python框架之django
python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...
- Django基础之安装配置
安装配置 一 MVC和MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...
随机推荐
- ubuntu(centos) server安装vmware tools
Ubuntu: root登录ubutun $ sudo su vmware中选择菜单虚拟机->安装VMware Tools 命令行如下 // 将cdrom挂载到mnt $ mount -t is ...
- select2 api参数中文文档
select2 api参数的文档 具体参数可以参考一下: 参数 类型 描述 Width 字符串 控制 宽度 样式属性的Select2容器div minimumInputLength int 最小数 ...
- 线段树 HDU-1166 敌兵布阵
敌兵布阵是一个线段树典题,题目如下(点此查看题目出处): Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国 ...
- JavaWeb-----实现第一个Servlet程序
1.Servlet简介 Servlet是在服务器端运行的一个小程序,实际上一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内 存里的servl ...
- Python在金融量开源项目列表
Python也已经在金融量化投资领域占据了重要位置,开源项目列表:
- vue 在浏览器控制台怎么调试 谷歌插件vue Devtools
vue 在浏览器控制台怎么调试 谷歌插件vue Devtools 问题: vuejs里面的变量,怎么用浏览器的console查看? 例如,想在chrome里用console.log查看变量$data, ...
- GoldenGate使用SQLEXEC和GETVAL实现码表关联
使用OGG中的SQLEXEC参数,可以执行SQL语句或存储过程,再加上@GETVAL函数,可以在目标端获取源表没有的字段值.比如,源端有一个事实表和一个代码表COUNTRY_CODES,代码表中有两个 ...
- opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点
一.简介 二.画出每个轮廓的每个点 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat src= ...
- 安装GDB-ImageWatch ,在QT中查看图像
GDB_ImageWatch是在Linux下基于QT编写图像处理程序的调试程序. 由于并非像ImageWatch一样由官方提供,而是在github上以代码的方式进行提供,我们在使用的时候需要自己编译, ...
- centos6.5安装zabbix3.2
1.安装PHP Zabbix 3以后对PHP的要求最低为5.4,而CentOS6默认为5.3.3,完全不满足要求,故需要利用第三方源,将PHP升级到5.4以上,注意,不支持PHP7 rpm -ivh ...