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)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...
随机推荐
- 三、latex源文件的基本结构
在latex中如何使用中文 首先在选项->设置->构建中默认编译器是不是用的是xelatex 编辑器的默认字体编码是不是UTF-8 在导言区引入ctex宏包
- 队列ADT
队列 队列是FIFO表,使用队列时在队尾(rear)插入元素,称之为入队(enqueue),以及在对头(front)删除并返回元素值,称之为出队(dequeue). 任何表的实现都可以用于实现队列结构 ...
- 下载文件 utils
package cn.itcast.bos.utils; import java.io.IOException; import java.net.URLEncoder; import sun. ...
- c# 文件与流
1.创建和删除目录 在c#中涉及到输入.输出(i/o)相关操作的API都被放在System.IO命名空间下,或者子命令System.IO.IsolatedStoorage中.对目录进行操作可以使用Di ...
- eclipse无法断点调试JDK源码的问题
最近换了新版的eclipse,在jdk源码里面,打断点发现无法进入源码调试,程序直接跳过,已查资料发现自己eclipse配置的是jre环境的. 此处要配成jdk目录才有效 打开preferences, ...
- Docker Weave 命令整理
Docker Weave 命令整理 # 查看weave状态 weave status # 查看状态详情 weave status connections # 查看weave相互之间节点建立的关系 we ...
- IVIEW对的table组件超出长度用省略号代替,使用气泡提示。
render: (h, params) => { return h('div', [ h('Tooltip', { props: { placement: 'top' } }, [ h('spa ...
- 使用C#加密及解密字符串
using System; using System.IO; using System.Security.Cryptography; using System.Text; namespace Util ...
- Lintcode97-Maximum Depth of Binary Tree-Easy
97. Maximum Depth of Binary Tree Given a binary tree, find its maximum depth. The maximum depth is t ...
- Java 爬虫学习
Java爬虫领域最强大的框架是JSoup:可直接解析具体的URL地址(即解析对应的HTML),提供了一套强大的API,包括可以通过DOM.CSS选择器,即类似jQuery方式来取出和操作数据.主要功能 ...