zoukankan      html  css  js  c++  java
  • DjangoORM查询、分页、ckeditor

    查询数据

    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.访问查看效果

     

  • 相关阅读:
    bzoj3302
    bzoj1264
    听风
    bzoj5073
    bzoj2144
    bzoj1263
    bzoj3653
    Docker 入门 2 镜像基本操作
    Docker 入门 1 准备 Docker 环境
    Docker Hub 镜像加速
  • 原文地址:https://www.cnblogs.com/songdanlee/p/11448836.html
Copyright © 2011-2022 走看看