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.訪問查看效果

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM