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)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...
随机推荐
- Java基础(认识Java)
我们要学习Java那么就要首先认识一下Java: Java是什么 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James ...
- Sitecore中Core,Master和Web数据库之间的区别
Core数据库 正如名称所示,Core Database是Sitecore应用程序的主干,它可用于多种用途. 核心数据库包含所有Sitecore设置. 它包含桌面模式,内容编辑器,页面编辑器等的定义. ...
- Windows下静态库与动态库的创建与使用
Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...
- Vue将px转化为rem适配移动端
Vue将px转化为rem适配移动端 1.下载lib-flexible我使用的是vue-cli+webpack,所以是通过npm来安装的npm i lib-flexible --save 2.引入lib ...
- Redis学习-hash数据类型
hash 类型是string类型的field和value的映射表,或者说是一个string集合,适合存储对象,相比较而言,将一个对象类型存储在hash类型里要比存储在string类型里占用更少的内存空 ...
- Docker Swarm volume 数据持久化
Docker Swarm volume 数据持久化 volume 是将宿主级的目录映射到容器中,以实现数据持久化. 可以用两种方式来实现: volume 默认模式:工作节点宿主机数据同步到容器内. v ...
- docker原理与上帝进程
做个笔记, 先水一会. 虚拟机指的是: 在软件的层面上通过模拟硬件进行的输入输出. docker原理:docker就是一个linux系统的进程, 它通过 Linux 的 namespaces 对不同的 ...
- [LspTrace]ReadAccConfig returns false! QT
当qt运行出现以下信息时 [LspTrace]ReadAccConfig returns false! [LspTrace]FindMatchingProvider: inInfo is one of ...
- ant___令牌过滤器
令牌过滤器允许我们在复制时过滤文件中的数据.要进行过滤,需要使用一个必须与过滤器任务中的@token @设置匹配的标记.任务使用@作为标记分隔符.为了实现此功能,apache ant提供了使用toke ...
- 单元测试系列之二:Mock工具Jmockit实战
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6760272.html Mock工具Jm ...