查询数据

Django的批量查询(查询所有,或者条件查询)返回的是queryset对象。

Queryset对象是一个惰性对象,在不执行

1、排序

2、循环

3、截取

操作的情况下,不会遍历序列的内容。

返回QuerySet对象的方法有:

all()、filter()、exelude()、order_by()、reverse()、distinct()

只要返回的是queryset对象就可以调用其他的方法,直到返回的是对象本身

查询 方法

 all():                  查询所有结果

filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,多个条件and关系

get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,
如果符合筛选条件的对象超过一个或者没有都会抛出错误。 exclude(**kwargs): 它包含了与所给筛选条件不匹配的对象 order_by(*field): 对查询结果排序 用法:order_by('-price') DESC 降序 reverse(): 对查询结果反向排序 count(): 返回数据库中匹配查询(QuerySet)的对象数量。 first(): 返回第一条记录 last(): 返回最后一条记录 exists(): 如果QuerySet包含数据,就返回True,否则返回False 相当于limit 1(用途查询这个表中是否有值) values(*field): 用法:Book.objects.all.values('title','price') 返回值是<queryset[{'title':'aa','pirce':12},{}] values_list(*field): 用法:Book.objects.all.values_list('title','price') 返回值是<queryset[('aa',12),('bb',33)]
distinct(): 从返回结果中剔除重复纪录 用法:Book.objects.all.values('title','price').distinct()
错误用法 Book.objects.all.distinct() 因为id不相同,其他相同,无法去重

模糊查询常用的操作

python manage.py shell 基于当前项目的交互式命令行

__lt 小于  

__lte 小于等于

__gt 大于

__gte 大于等于

__in 在某个范围,返回文章id为5,8的数据

__contains包含个范围,类似于like

__exact 精确等于 like 'aaa'
__iexact 精确等于 忽略大小写 ilike 'aaa'
__contains 包含 like '%aaa%'
__icontains 包含,忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。

__isnull 判空

Student.objects.filter(name__isnull=True) // 查询用户名为空的学生
Student.objects.filter(name__isnull=False) // 查询用户名不为空的学生

__startswith 以…开头
__istartswith 以…开头 忽略大小写
__endswith 以…结尾
__iendswith 以…结尾,忽略大小写
__range 在…范围内    models.Tb1.objects.filter(id__range=[1, 3])      # id范围是1到3的,等价于SQL的bettwen and

[:]分页,索引默认从0开始,不包括结束索引,返回前1-4条数据(从0开始)

查询文章对应的作者

article.article_author

查询作者对应的文章

atype.article_set.all()

  

查询文章对应的类型

article.article_type.all()

  

查询类型对应的文章

atype.article_set.all()

总结:正向查询 表中有外键字段,直接对象.关联外键字段.字段(一对一,一对多)

  一对一获取的是一个对象,多对多需要调用all()获取到所有

  反向操作表中没有外键字段,获取关联数据,只用对象.关联表的类名(小写)_set.all()

增加数据

普通数据

1. ArticleType.objects.create(label='蓬莱鬼话',description='12333')

2.atype = ArticleType()

atype.label = '蓬莱鬼话'

atype.description= '一篇提神醒脑'

atype.save()

保存时间

import datetime

article.public_time = datetime.datetime.now()

添加外键

添加的数据是外键映射的一条数据,不是id字段

三张表关系如下:

作者

文章类型

文章:和作者一对一关系,和类型多对多关系

添加一对一关系:

article = Article()

article.title='骆驼祥子'

...

article.article_author = Author.objects.get(id=1)

添加多对多关系

article.article_type.add(ArticleType.objects.get(id=1))

删除数据

删除多条

修改数据

1、Update

2、使用实例修改

分页

django 自带分页功能

pagtor = Paginator(User.objects.all(),per_page=3) # 构造分页器对象
pagtor.count:所有页面对象总数,即统计object_list中item数目。
pagtor.num_pages:页面总数。
pagiator.page_range:页面范围,从1开始,例如[1,2,3,4]
page = Paginator(User.objects.all(),per_page=3).page(1) # 获取第一页
Page.has_next () 如果有下一页,则返回 True
Page.has_previous () 如果有上一页,返回 True
Page.has_other_pages () 如果有上一页或下一页,返回 True
Page.next_page_number () 返回下一页的页码。如果下一页不存在,抛出 InvlidPage 异常
Page.previous_page_number () 返回上一页的页码。如果上一页不存在,抛出InvalidPage异常
Page.start_index () 返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。比如,将
五个对象的列表分为每页两个对象,第二页的 start_index() 会返回 3
Page.end_index () 返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,
将五个对象的列表分为每页两个对象,第二页的 end_index() 会返回 4
Page.object_list 当前页上所有对象的列表
Page.number 当前页的序号,从1开始
Page.paginator 相关的 Paginator 对象

  

from django.core.paginator import Paginator

def newList(request,types,p):
"""
:param request:
:param types: 文章类型
:param p: 页码
:return:
"""
p = int(p)
page_size = 6
articles = ArticleType.objects.get(label=types).article_set.order_by("-public_time") article_list = Paginator(articles,page_size) # 进行分页
page_article = article_list.page(p) # 返回对应页码
page_range = set_page(article_list.page_range,p)
# article_list.num_pages 总页码数,article_list.page_range 下标从 1 开始的页数范围迭代器,article_list.count表示所有页面的对象总数 return render(request,"newlist.html",locals())

html 使用

<div class="pagelist">页次:{{ p }}/{{ article_list.num_pages}} 每页{{ page_size }} 总数{{ article_list.count }}
<a href="/newList/{{ types }}/1/">首页</a>
{%if p > 1 %}
<a href="/newList/{{ types }}/{{ p|add:-1 }}/" >上一页</a>
{% endif %} {% for p in page_range %}
<a href="/newList/{{ types }}/{{ p }}">{{ p }}</a>
{% endfor %} {%if p < article_list.num_pages %}
<a href="/newList/{{ types }}/{{ p|add:1 }}/">下一页</a>
{% endif %} <a href="/newList/{{ types }}/{{ article_list.num_pages }}/">尾页</a></div>
</div>

后台使用ckeditor

1.安装ckeditor ,pip install django-ckeditor

2.settings.py配置

CKEDITOR_UPLOAD_PATH = 'uploads/' # 上传路径
CKEDITOR_IMAGE_BACKEND = 'pillow' # 上传图片使用的模块

3. 替换模型中字段

from ckeditor.fields import RichTextField

description = RichTextField()
content = RichTextField()

4.访问查看效果

最新文章

  1. RabbitMQ简单测试
  2. php中global与$GLOBALS的用法及区别
  3. 深入学习:Windows下Git入门教程(上)
  4. 三分--Football Goal(面积最大)
  5. border透明
  6. Careercup - Facebook面试题 - 6685828805820416
  7. session cookie原理及应用
  8. 求1e11以内的素数
  9. 启用oracle 11g自己主动收集统计信息
  10. Dotnetty 的心跳
  11. MySQL----mysql57服务突然不见了的,解决方法
  12. android dm-verity 功能【转】
  13. mongodb删除重复数据
  14. Python3-RabbitMQ 3.7.2学习——环境搭建(一)
  15. python爬虫---urllib库的基本用法
  16. 关于[x/y]一些小想法
  17. 对接微信支付使用HMAC-SHA256使用签名算法实现方式
  18. IntelliJ IDEA 下载和激活
  19. unity对敏感词库处理的记录
  20. Java API 之 Properties 类

热门文章

  1. Swimming Balls
  2. 基于MFC的实时可视化项目中视图刷新消息的严谨使用
  3. python 编程 一次错误记录 -1073740791
  4. js实现获取两个日期之间所有日期的方法
  5. 基于SpringBoot的开源微信开发平台,Jeewx-Boot 1.0 版本发布
  6. Servlet和模本办法
  7. Plugin org.apache.maven.plugins:maven-clean-plugin:2.4.1 or one of its dependencies could not be resolved: Failed to read artifact descriptor for org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1
  8. PKU_3624(0-1背包)
  9. [Ceoi2007]Royaltreasury
  10. 2、mysql密码过期的修改方法(your password has expired)