Django------filter查詢的使用


一:filter查詢可以方便的查詢出我們需要使用的信息:

def blogdetail(request,aricle_id):
    contenx = {}
    detail = contenx['detail'] = get_object_or_404(Blog,pk = aricle_id)
    contenx['blog_previous'] = Blog.objects.filter(create_time__gt = detail.create_time).last()#得到上一頁信息
    contenx['blog_next'] = Blog.objects.filter(create_time__lt = detail.create_time).first()#下一頁信息
    contenx['detail'] =detail
    return render_to_response('blog/detail.html',contenx)

 一、下面來看看:filter查詢:

1.__contains(包含)

shell命令下查詢:Blog.objects.filter(title__contains ="django")------------------>返回一個queryset[]查詢(查詢集)只能輸入一個值。加上一個"i"后不區別大小寫【sql等數據庫中】

2.__in (其中之一,可以傳入一個列表,傳多個值。)

Blog.objects.filter(id__in = [3,6,9])

3.__range(一個范圍,使用元祖):

> Blog.objects.filter(id__range =(30,45))

二、前面講的是包含的查詢,下面來看看不包含的查詢:

exclude方法為不包含的:

 Blog.objects.exclude(id=3)

三、日期類型查詢

Blog.objects.filter(create_time__year = 2018)------------->查詢年為2018年的內容

Blog.objects.filter(create_time__month=3)----------------->查詢月

 

四、日期查詢類型只是篩選了條件,怎么讓條件在前端顯示呢?django提供了一個dates方法:

Blog.objects.dates('create_time', 'year','DESC')--------------------->分別為:時間字段,查詢返回年year,年月month,年月日day,最后一個參數是排序方式ASC正序,DESC倒序。

def blog_with_date(request,year,month):
    contenx={}
    blogs= Blog.objects.filter(create_time__year = year ,create_time__month = month)
    paginator = Paginator(blogs, settings.EACH_OF_BLOGS_NUMBER)#每10篇文章分一頁
    page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號
    page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值
    current_page_num = page_of_blogs.number#獲得當前頁
    # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值
    range_page = list(range(max(current_page_num-2,1),current_page_num))+\
                list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1))
    # range(當前到---->想要的那個值取到最后最小的那個值)

    #添加省略號
    if range_page[0]-1>=2:
        range_page.insert(0,'...')
    if paginator.num_pages-range_page[-1]>=2:
        range_page.append('...')
    #添加首頁和尾頁
    if range_page[0]!=1:
        range_page.insert(0,1)
    if range_page[-1]!=paginator.num_pages:
        range_page.append(paginator.num_pages)
    contenx['blogs_with_date'] = '%s年%s月'%(year,month)
    contenx['blogs'] = page_of_blogs.object_list
    contenx['page_of_blogs'] =  page_of_blogs
    contenx['range_page'] = range_page
    contenx['blogtypes']= Blogtype.objects.all()#獲取所有的分類
    contenx['blog_dates'] = Blog.objects.dates('create_time','month','DESC')
    return render_to_response('blog/blog_with_date.html',contenx)

 五、代碼整理公共部分提取

from django.shortcuts import render_to_response,get_object_or_404
from .models import Blog,Blogtype
from django.conf import settings
from django.core.paginator import Paginator
# Create your views here.
# EACH_OF_BLOGS_NUMBER = 7

def get_blog_artacile_common_date(request,blogs):
    paginator = Paginator(blogs, settings.EACH_OF_BLOGS_NUMBER)#每10篇文章分一頁
    page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號
    page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值
    current_page_num = page_of_blogs.number#獲得當前頁
    # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值
    range_page = list(range(max(current_page_num-2,1),current_page_num))+\
                list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1))
    # range(當前到---->想要的那個值取到最后最小的那個值)

    #添加省略號
    if range_page[0]-1>=2:
        range_page.insert(0,'...')
    if paginator.num_pages-range_page[-1]>=2:
        range_page.append('...')
    #添加首頁和尾頁
    if range_page[0]!=1:
        range_page.insert(0,1)
    if range_page[-1]!=paginator.num_pages:
        range_page.append(paginator.num_pages)
    contenx = {}
    contenx['page_of_blogs'] =  page_of_blogs
    contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章
    # contenx['count'] = Blog.objects.all().count()
    contenx['blog_dates'] = Blog.objects.dates('create_time','month','DESC')
    contenx['range_page'] = range_page
    contenx['blogtypes'] = Blogtype.objects.all()#獲取所有的分類
    return contenx

def bloglist(request):
    blogs = Blog.objects.all()
    contenx = get_blog_artacile_common_date(request,blogs)
    return render_to_response('blog/list.html',contenx)

def blog_with_type(request,typename_pk):
    typename = get_object_or_404(Blogtype,pk = typename_pk)#拿到傳入的類型參數
    blogs = Blog.objects.filter(typename=typename)
    contenx =get_blog_artacile_common_date(request,blogs)
    contenx['typename'] = typename#顯示分類列
    return render_to_response('blog/blog_with_type.html',contenx)


def blog_with_date(request,year,month):
    blogs= Blog.objects.filter(create_time__year = year ,create_time__month = month)
    contenx=get_blog_artacile_common_date(request,blogs)
    contenx['blogs_with_date'] = '%s年%s月'%(year,month)
    return render_to_response('blog/blog_with_date.html',contenx)


def blogdetail(request,aricle_id):
    contenx = {}
    detail = get_object_or_404(Blog,pk = aricle_id)
    contenx['blog_previous'] = Blog.objects.filter(create_time__gt = detail.create_time).last()#得到上一頁信息
    contenx['blog_next'] = Blog.objects.filter(create_time__lt = detail.create_time).first()#下一頁信息
    contenx['detail'] =detail
    return render_to_response('blog/detail.html',contenx)

原來代碼:

def bloglist(request):
    blogs = Blog.objects.all()
    paginator = Paginator(blogs, settings.EACH_OF_BLOGS_NUMBER)#每10篇文章分一頁
    page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號
    page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值
    current_page_num = page_of_blogs.number#獲得當前頁
    # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值
    range_page = list(range(max(current_page_num-2,1),current_page_num))+\
                list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1))
    # range(當前到---->想要的那個值取到最后最小的那個值)

    #添加省略號
    if range_page[0]-1>=2:
        range_page.insert(0,'...')
    if paginator.num_pages-range_page[-1]>=2:
        range_page.append('...')
    #添加首頁和尾頁
    if range_page[0]!=1:
        range_page.insert(0,1)
    if range_page[-1]!=paginator.num_pages:
        range_page.append(paginator.num_pages)


    contenx = {}
    contenx['page_of_blogs'] =  page_of_blogs
    contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章
    # contenx['count'] = Blog.objects.all().count()
    contenx['blog_dates'] = Blog.objects.dates('create_time','month','DESC')
    contenx['range_page'] = range_page
    contenx['blogtypes'] = Blogtype.objects.all()#獲取所有的分類
    return render_to_response('blog/list.html',contenx)

def blog_with_type(request,typename_pk):
    contenx ={}
    typename = get_object_or_404(Blogtype,pk = typename_pk)#拿到傳入的類型參數
    blogs = Blog.objects.filter(typename=typename)
    paginator = Paginator(blogs, settings.EACH_OF_BLOGS_NUMBER)#每10篇文章分一頁
    page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號
    page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值
    current_page_num = page_of_blogs.number#獲得當前頁
    # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值
    range_page = list(range(max(current_page_num-2,1),current_page_num))+\
                list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1))
    # range(當前到---->想要的那個值取到最后最小的那個值)

    #添加省略號
    if range_page[0]-1>=2:
        range_page.insert(0,'...')
    if paginator.num_pages-range_page[-1]>=2:
        range_page.append('...')
    #添加首頁和尾頁
    if range_page[0]!=1:
        range_page.insert(0,1)
    if range_page[-1]!=paginator.num_pages:
        range_page.append(paginator.num_pages)
    contenx['page_of_blogs'] =  page_of_blogs
    contenx['blogs'] = page_of_blogs.object_list#獲取符合參數所有的文章
    # contenx['count'] = Blog.objects.all().count()
    contenx['range_page'] = range_page
    contenx['typename'] = typename#顯示分類列
    contenx['blogtypes']= Blogtype.objects.all()#獲取所有的分類
    contenx['blog_dates'] = Blog.objects.dates('create_time','month','DESC')
    return render_to_response('blog/blog_with_type.html',contenx)


def blog_with_date(request,year,month):
    contenx={}
    blogs= Blog.objects.filter(create_time__year = year ,create_time__month = month)
    paginator = Paginator(blogs, settings.EACH_OF_BLOGS_NUMBER)#每10篇文章分一頁
    page_num = request.GET.get('page',1)#GET方法獲得url參數?page1 page是參數需要帶引號
    page_of_blogs = paginator.get_page(page_num)#get_page方法處理用戶輸入的錯誤值
    current_page_num = page_of_blogs.number#獲得當前頁
    # 比較截取到想要的那個數到最小值1時用小的值和1作比較生成一個從小到當前的值
    range_page = list(range(max(current_page_num-2,1),current_page_num))+\
                list(range(current_page_num, min(current_page_num+2,paginator.num_pages)+1))
    # range(當前到---->想要的那個值取到最后最小的那個值)

    #添加省略號
    if range_page[0]-1>=2:
        range_page.insert(0,'...')
    if paginator.num_pages-range_page[-1]>=2:
        range_page.append('...')
    #添加首頁和尾頁
    if range_page[0]!=1:
        range_page.insert(0,1)
    if range_page[-1]!=paginator.num_pages:
        range_page.append(paginator.num_pages)
    contenx['blogs_with_date'] = '%s年%s月'%(year,month)
    contenx['blogs'] = page_of_blogs.object_list
    contenx['page_of_blogs'] =  page_of_blogs
    contenx['range_page'] = range_page
    contenx['blogtypes']= Blogtype.objects.all()#獲取所有的分類
    contenx['blog_dates'] = Blog.objects.dates('create_time','month','DESC')
    return render_to_response('blog/blog_with_date.html',contenx)

 


免責聲明!

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



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