日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数

發布時間:2023/11/29 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天的注冊收尾工作

其實就差了和MySql聯系起來的部分,這部分很簡單,首先要做的就是保存用戶通過from傳送過來的頭像文件:

""" 保存頭像文件 """ file = request.FILES.get('avatar') file_path = os.path.join('static/img', file.name) with open(file_path, 'wb') as f:for chunk in file.chunks():f.write(chunk) # 寫文件

然后就是保存用戶輸入的值到對應數據庫的表,利用ORM可以很簡單的寫出來:

v = request.POST result = models.UserInfo.objects.create(username=v.get('username'),password=v.get('password'),email=v.get('email'),nickname=v.get('username'),avatar='/' + file_path, )

進入對應博客所需的路由配置問題

我們訪問一個博客主頁的時候是不需要登陸信息的只要訪問類似http://127.0.0.1:8000/blog/***.html之類的網址就可以進入對應博客獲取需要的信息,所以在設置路由的時候我額外加了一個參數,用來將博主的名字來作為博客網址的一部分:

re_path('^blog/(\w+).html$', views.blog)

在處理函數中多加一個name參數,用來接收(\w+)處的參數:

def blog(request, name):return render(request, 'blog.html', {'name': name})

這樣路由的文件就簡單解決了,后續可能會優化一些。

個人主頁博客文章的類型分類(一對一)

在寫博客主頁之前,我想先想一想頁面中展示博客文章分類的部分。

首先是獲取對應的博客對象,這個很好獲取,利用上面的name參數可以很簡單的做到:

blog = models.Blog.objects.filter(site=name).first()

首先想到的就是利用當前博客的分類來反向查找對應的所有文章,計算出查找到的文章數就可以得到對應分類下的文章數了:

# 當前博客所有分類 cate_list = models.Category.objects.filter(blog=blog) for item in cate_list: # 遍歷每一個分類項c = item.article_set.all().count() # 利用分類項反向查找到對應的所有文章并計算出文章數返回print(item,c)

但是這種方法有一個不好的地方,那就是需要頻繁的去數據庫查詢,這樣后期會大大拖慢服務器的反應速度。

我想到了利用Group By來一次性查詢所有需要的值,SQL語句如下:

select category_id, count(nid) as c from article where blog_id = *** group by category_id

但是用ORM來做的話需要values和annotate函數配合使用來達到分組查詢的目的:

category_list = models.Article.objects.filter(blog=blog).values('category_id','category__title',).annotate(c=Count('nid'))  # 這里反向查找了分類名,為了更方便的顯示在頁面上

個人主頁博客文章的標簽分類(多對多)

?差不多的道理:

models.Article2Tag.objects.filter(tag__blog=blog).values('tag_id','tag__title').annotate(c=Count('id'))

個人主頁博客文章的時間分類

時間分類需要注意的地方其實就是時間格式的轉換,可以利用MySQL 中的DATE_FORMAT() 函數具體的可以參照我的小知識總結,SQL語句如下:

select date_format(create_time,'%Y-%m'),count(nid) as c from article where blog_id=1 group by date_format(create_time,'%Y-%m')

但是在ORM中怎么做呢,可以利用extra函數來為表增加額外的一個字段,以做到分組查詢的目的:

date_list = models.Article.objects.filter(blog=blog).extra(select={'c': "date_format(create_time,'%%Y-%%m')"}).values('c').annotate(ct=Count('nid'))

Django ORM內置函數和函數的自定義

ORM內置函數主要有基礎函數和時間函數兩種:

# 基礎函數 Cast, Coalesce, Concat, ConcatPair, Greatest, Least, Length, Lower, Now, Substr, Upper, # 時間函數 Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay,TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear,

通過annotate函數來調用這些基礎函數例如:

from django.db.models import FloatField from django.db.models import Value v = models.Article.objects.annotate(c=functions.Cast('nid', FloatField())) v = models.Article.objects.annotate(c=functions.Coalesce('title','summary')) v = models.Article.objects.annotate(c=functions.Concat('nid','title','summary')) v = models.Article.objects.annotate(c=functions.Concat('nid','title','summary',Value('666'))) v = models.Article.objects.annotate(c=functions.Greatest('nid','num')) v = models.Article.objects.annotate(c=functions.Length('title')) v = models.Article.objects.annotate(c=functions.Substr('title',1,1))

所有函數的功能列舉如下(以下內容參照了這個大神的博客):

# ########### 基礎函數 ############ 1. Concat,用于做類型轉換# v = models.UserInfo.objects.annotate(c=Cast('pwd', FloatField()))# 2. Coalesce,從前向后,查詢第一個不為空的值# v = models.UserInfo.objects.annotate(c=Coalesce('name', 'pwd'))# v = models.UserInfo.objects.annotate(c=Coalesce(Value('666'),'name', 'pwd'))# 3. Concat,拼接# models.UserInfo.objects.update(name=Concat('name', 'pwd'))# models.UserInfo.objects.update(name=Concat('name', Value('666')))# models.UserInfo.objects.update(name=Concat('name', Value('666'),Value('999')))# 4.ConcatPair,拼接(僅兩個參數)# v = models.UserInfo.objects.annotate(c=ConcatPair('name', 'pwd'))# v = models.UserInfo.objects.annotate(c=ConcatPair('name', Value('666')))# 5.Greatest,獲取比較大的值;least 獲取比較小的值;# v = models.UserInfo.objects.annotate(c=Greatest('id', 'pwd',output_field=FloatField()))# 6.Length,獲取長度# v = models.UserInfo.objects.annotate(c=Length('name'))# 7. Lower,Upper,變大小寫# v = models.UserInfo.objects.annotate(c=Lower('name'))# v = models.UserInfo.objects.annotate(c=Upper('name'))# 8. Now,獲取當前時間# v = models.UserInfo.objects.annotate(c=Now())# 9. substr,子序列# v = models.UserInfo.objects.annotate(c=Substr('name',1,2))
# ########### 時間類函數 ############ 1. 時間截取,不保留其他:Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,ExtractSecond, ExtractWeekDay, ExtractYear,# v = models.UserInfo.objects.annotate(c=functions.ExtractYear('ctime'))# v = models.UserInfo.objects.annotate(c=functions.ExtractMonth('ctime'))# v = models.UserInfo.objects.annotate(c=functions.ExtractDay('ctime'))## v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'year'))# v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'month'))# v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'year_month'))"""MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECONDHOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECONDDAY_SECONDDAY_MINUTEDAY_HOURYEAR_MONTH"""# 2. 時間截圖,保留其他:Trunc, TruncDate, TruncDay,TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear# v = models.UserInfo.objects.annotate(c=functions.TruncHour('ctime'))# v = models.UserInfo.objects.annotate(c=functions.TruncDate('ctime'))# v = models.UserInfo.objects.annotate(c=functions.Trunc('ctime','year'))

ORM自定義函數的寫法:

from django.db.models.functions.base import Funcclass CustomeFunc(Func):function = 'DATE_FORMAT'template = '%(function)s(%(expressions)s,%(format)s)'def __init__(self, expression, **extra):expressions = [expression]super(CustomeFunc, self).__init__(*expressions, **extra)v = models.UserInfo.objects.annotate(c=CustomeFunc('ctime',format="'%%Y-%%m'"))

  

轉載于:https://www.cnblogs.com/yu-jie/p/9289908.html

總結

以上是生活随笔為你收集整理的2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。