Django--filter(**kwargs)-exclude(**kwargs)


filter()

说明:

  1. 数据的过滤
  2. 返回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)的更多相关文章

  1. Django filter中用contains 在mysql中的问题

    用PYTHON ,DJANGO 做站,在通常的情况下,需要用到 orM 的查询方法,比如object.filter(tag__contains='keywords').... 在这种情况下,如果你跟踪 ...

  2. django filter or 多条件查询

    功能:django中实现多条件查询 或关系: from django.db.models import Q return qs.filter(Q(notice_to_group__contains=' ...

  3. 【Python】Django filter 如何支持 or 条件过滤?

    from django.db.models import Q Item.objects.filter(Q(creator=owner) | Q(moderated=False)) 代码示例: if(r ...

  4. Django模版中的过滤器详细解析 Django filter大全

    就象本章前面提到的一样,模板过滤器是在变量被显示前修改它的值的一个简单方法. 过滤器看起来是这样的: {{ name|lower }} 显示的内容是变量 {{ name }} 被过滤器 lower 处 ...

  5. 关于Django ORM filter方法小结

    django filter是一个过滤器,相当于SQL的select * from where. filter返回一个QuerySet对象,还可以在该对象上继续进行django orm 该有的操作. 有 ...

  6. django中的objects.get和objects.filter方法的区别

    为了说明它们两者的区别定义2个models class Student(models.Model): name = models.CharField('姓名', max_length=20, defa ...

  7. django model的get和filter方法的区别

    django的get方法: 1django的get方法是从数据库的取得一个匹配的结果,返回一个对象,如果记录不存在的话,它会报错. 2如果你用django的get去取得关联表的数据的话,而关键表的数据 ...

  8. Python攻关之Django(一)

    课程简介: Django流程介绍 Django url Django view Django models Django template Django form Django admin (后台数据 ...

  9. python框架之django

    python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django temple django models ...

  10. Django基础之安装配置

    安装配置 一 MVC和MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业务对象与数据库的 ...

随机推荐

  1. 解决.NET iis初次加载超级慢

    禁止证书的验证过程:1.在下面aspnet.config文件中加入下面内容:     32位系统:C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspne ...

  2. 查看容器IP地址

    我们可以通过以下命令查看容器运行的各种数据 docker inspect 容器名称(容器ID)  也可以直接执行下面的命令直接输出IP地址 docker inspect --format='{{.Ne ...

  3. Feign 与 Hystrix

    Feign 与 Hystrix Feign是一个声明式的web服务客户端,它使得web服务调用非常的简单,当我们使用Feign时,Spring Cloud 整合了Ribbon和Eureka,从而为我们 ...

  4. [Luogu]A%BProblem——线性筛素数与前缀和

    题目描述 题目背景 题目名称是吸引你点进来的[你怎么知道的] 实际上该题还是很水的[有种不祥的预感..] 题目描述 区间质数个数 输入输出格式 输入格式: 一行两个整数 询问次数n,范围m接下来n行, ...

  5. 20165215 2017-2018-2《Java程序设计》课程总结

    20165215 2017-2018-2<Java程序设计>课程总结 一.每周作业链接汇总 预备作业1:我期望的师生关系:令我记忆深刻的老师,期望的师生关系,本学期的学习规划. 预备作业二 ...

  6. [转载]Oracle Golden Gate - 概念和机制 (ogg)

    出处:https://www.cnblogs.com/qiumingcheng/p/5435907.html Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉.变换.投递. OGG ...

  7. K8S学习笔记之二进制部署Kubernetes v1.13.4 高可用集群

    0x00 概述 本次采用二进制文件方式部署,本文过程写成了更详细更多可选方案的ansible部署方案 https://github.com/zhangguanzhang/Kubernetes-ansi ...

  8. Html textarea 标签

    Html textarea 标签 </body> </html> <!-- textarea 标签输入多行文本框,name="xxx"标识后端获取名称 ...

  9. onblur 事件

    onblur 事件 Event 对象 定义和用法 onblur 事件会在对象失去焦点时发生. 语法 onblur="SomeJavaScriptCode" 参数 描述 SomeJa ...

  10. 8、zabbix监控方式及分布式监控(04)

    zabbix支持的监控方式 zabbix所能够显示的且可指定为监控接口类型的监控方式: Agent passive active SNMP:Simple Network Management Prot ...