django view

      網(wǎng)友投稿 806 2025-04-03

      django View


      URL是Web服務(wù)的入口,用戶通過瀏覽器發(fā)送過來的任何請求,都是發(fā)送到一個指定的URL地址,然后被響應(yīng)。

      隨便新建一個Django項目,默認(rèn)會自動為我們創(chuàng)建一個/project_name/urls.py文件,并且自動包含下面的內(nèi)容,這就是項目的根URL:

      settings.py

      #?媒體文件配置

      MEDIA_URL?=?'/media/'

      MEDIA_ROOT?=?os.path.join(BASE_DIR,?'media')

      1

      url.py

      確保在渲染的html渲染對應(yīng)的媒體文件

      from?django.urls?import?path,include

      from?django.conf?import?settings

      from?django.conf.urls.static?import??static

      urlpatterns?=?[

      #?path('admin/',?admin.site.urls),

      path('myadmin/',include('myadmin.urls')),

      path('',include('news.urls')),

      path('',include('verification.urls')),

      path('course/',include('course.urls')),

      path('doc/',include('doc.urls')),

      path('user/',include('user.urls')),

      path('ckeditor/',include('ckeditor_uploader.urls')),

      ]?+?static(settings.MEDIA_URL,document_root?=?settings.MEDIA_ROOT)

      1

      需要在urlpatterns 列表后面加上 static(settings.MEDIA_URL,document_root = settings.MEDIA_ROOT)

      include 指的就是包含該app下的url

      from??django.Views?import?View

      class?IndexView(View):

      '''

      在線課堂首頁面

      '''

      def?get(self,request):

      #?1.?拿到所有的視頻數(shù)據(jù)

      courses?=?Course.objects.only('title','cover_url','teacher__name','teacher__title').select_related('teacher').filter(is_delete?=?False)

      return?render(request,'course/course.html',context=?{'courses':courses})

      class?CourseDetailView(View):

      '''

      課程詳細(xì)頁

      url?:/course//

      '''

      def?get(self,request,course_id):

      #?1.?拿到課程信息

      course?=?Course.objects.only('title','cover_url','video_url','profile','outline','teacher__name','teacher__photo','teacher__title','teacher__profile').select_related('teacher').filter(is_delete?=?False,id?=?course_id)

      #?2.?渲染html

      if?course:

      course?=?course[0]

      return??render(request,'course/course_detail.html',context={'course':course})

      else:

      return??Http404('此課程不存在')

      1

      對應(yīng)的url就使用as_view()函數(shù)方法

      from?django.urls?import?path

      from??.?import?views

      app_name?=?'course'

      urlpatterns?=?[

      path('',views.IndexView.as_view(),name?=?'index'),

      path('/',views.CourseDetailView.as_view(),name?=?'course_detail'),

      ]

      1

      拿到對應(yīng)數(shù)據(jù)庫的模型對象

      渲染到對于的html頁面

      get

      就是當(dāng)我訪問當(dāng)url是,就是執(zhí)行g(shù)et的方法

      def?get(self,?request):

      return?render(request,?'user/login.html')

      1

      post

      class?LoginView(View):

      """

      登錄視圖

      url:?/user/login/

      """

      def?get(self,?request):

      return?render(request,?'user/login.html')

      def?post(self,?request):

      #?1.先校驗

      #?loginform是登錄的表單,在form.py編寫導(dǎo)入

      form?=?LoginForm(request.POST,?request=request)

      if?form.is_valid():

      return?json_response(errmsg='恭喜登錄成功!')

      else:

      #?將表單的報錯信息進(jìn)行拼接

      err_msg_list?=?[]

      for?item?in?form.errors.values():

      err_msg_list.append(item[0])

      err_msg_str?=?'/'.join(err_msg_list)

      return?json_response(errno=Code.PARAMERR,?errmsg=err_msg_str)

      1

      如當(dāng)我登錄的時候就會訪問登錄的界面發(fā)送get請求,提交數(shù)據(jù)在數(shù)據(jù)庫就是post請求

      put

      put請求容易給人忽視,用于修改,當(dāng)要修改用戶的數(shù)據(jù)

      class?UserUpdateView(View):

      """

      用戶更新視圖

      url:/myadmin/user//

      def?get(self,?request,?user_id):

      user?=?User.objects.filter(id=user_id).first()

      if?user:

      form?=?UserModelForm(instance=user)

      else:

      return?json_response(errno=Code.NODATA,?errmsg='沒有此用戶!')

      return?render(request,?'myadmin/user/user_detail.html',?context={'form':?form})

      """

      def?put(self,?request,?user_id):

      #?1.?拿到要修改的用戶對象

      user?=?User.objects.filter(id=user_id).first()

      #?1.1?判斷用戶是否存在

      if?not?user:

      return?json_response(errno=Code.NODATA,?errmsg='沒有此用戶!')

      #?2.?拿到前端傳遞的參數(shù)

      put_data?=?QueryDict(request.body)

      #?3.?校驗參數(shù)

      #?3.1?創(chuàng)建表單對象

      #?UserModelForm在form.py自定義的

      form?=?UserModelForm(put_data,?instance=user)

      if?form.is_valid():

      #?4.?如果成功,保存數(shù)據(jù)

      form.save()

      return?json_response(errmsg='用戶修改成功!')

      else:

      #?5.?如果不成功就返回渲染了錯誤提示信息的頁面

      return?render(request,?'myadmin/user/user_detail.html',?context={'form':?form})

      1

      >>>?QueryDict('a=1&a=2&c=3')

      1

      一般我們看到的數(shù)據(jù)就是json的鍵值對,而不是列表

      request.body就是form表單的數(shù)據(jù)

      Queryset

      django view

      Django ORM用到三個類:Manager、QuerySet、Model。

      Manager定義表級方法(表級方法就是影響一條或多條記錄的方法),我們可以以models.Manager為父類,定義自己的manager,增加表級方法;

      QuerySet:Manager類的一些方法會返回QuerySet實(shí)例

      連數(shù)據(jù)都那不出來,寫啥視圖

      所以在編寫queryset必須用django shell 調(diào)試

      在model中,Django通過給Model增加一個objects屬性來提供數(shù)據(jù)操作大的接口。比如:想要查詢所有評論的數(shù)據(jù),可以這么寫:

      Comments.objects.all()

      #?可切片

      Comments.objects.all()[0:1]

      #?可迭代

      for?coment?in?comments:

      print(comment.author?)

      1

      exists() 判斷是否存在

      難度提升

      #?is_delete是繼承baseModel

      docs?=?Doc.objects.values('file_url','file_name','title','desc','image_url').filter(is_delete=?False)

      1

      現(xiàn)在拿到?jīng)]有刪除的部分?jǐn)?shù)據(jù),不拿author字段

      app.object的用法

      filter() 過濾查詢對象。

      exclude() 排除滿足條件的對象

      annotate() 使用聚合函數(shù)

      order_by() 對查詢集進(jìn)行排序

      reverse() 反向排序

      distinct() 對查詢集去重

      values() 返回包含對象具體值的字典的QuerySet

      values_list() 與values()類似,只是返回的是元組而不是字典。

      dates() 根據(jù)日期獲取查詢集

      datetimes() 根據(jù)時間獲取查詢集

      none() 創(chuàng)建空的查詢集

      all() 獲取所有的對象

      union() 并集

      intersection() 交集

      difference() 差集

      select_related() 附帶查詢關(guān)聯(lián)對象

      prefetch_related() 預(yù)先查詢

      extra() 附加SQL查詢

      defer() 不加載指定字段

      only() 只加載指定的字段

      using() 選擇數(shù)據(jù)庫

      select_for_update()

      raw()

      不熟悉SQL的可以跳過該部分,如下代碼:

      sql?=?'select?*?from?new'?#需要查詢數(shù)據(jù)庫具體new對應(yīng)表名

      qs?=?new.objects.raw(sql)?#將sql語句轉(zhuǎn)成RawQuerySet對象

      該SQL是獲取全部記錄,相當(dāng)于QuerySet如下查詢:

      qs?=?new.objects.all()

      1

      filter是篩選的意思,通過filter篩選得到符合條件的數(shù)據(jù)集。

      tags?=?Tag.objects.only('name').filter(is_delete=False)

      1

      返回的是queryset字典,不是對象,only才是返回的是對象

      docs?=?Doc.objects.values('file_url','file_name','title','desc','image_url').filter(is_delete=?False)

      docs?=?Doc.objects.only('file_url','file_name','title','desc','image_url').filter(is_delete=?False)

      1

      如果我要拿這個模型通過外鍵綁定的另外一個模型,使用select_related

      course 模型定義了teacher字段綁定teacher模型

      course?=?Course.objects.only('title','cover_url','video_url','profile','outline','teacher__name','teacher__photo','teacher__title','teacher__profile').select_related('teacher').filter(is_delete?=?False,id?=?course_id)

      1

      官方文檔:https://docs.djangoproject.com/en/2.1/topics/db/aggregation/

      Django的aggregate和annotate方法屬于高級查詢方法,主要用于組合查詢,是Django高手們必需要熟練掌握的。當(dāng)我們需要對查詢集(queryset)的某些字段進(jìn)行計算或進(jìn)行先分組再計算或排序, 我們就需要使用aggregate和annotate方法了。

      aggregate

      下面代碼來源官網(wǎng)

      from?django.db?import?models

      class?Author(models.Model):

      name?=?models.CharField(max_length=100)

      age?=?models.IntegerField()

      class?Publisher(models.Model):

      name?=?models.CharField(max_length=300)

      class?Book(models.Model):

      name?=?models.CharField(max_length=300)

      pages?=?models.IntegerField()

      price?=?models.DecimalField(max_digits=10,?decimal_places=2)

      rating?=?models.FloatField()

      authors?=?models.ManyToManyField(Author)

      publisher?=?models.ForeignKey(Publisher,?on_delete=models.CASCADE)

      pubdate?=?models.DateField()

      class?Store(models.Model):

      name?=?models.CharField(max_length=300)

      books?=?models.ManyToManyField(Book)

      >>>?Book.objects.count()

      2452

      #?publisher__name?是?book通過publisher綁定的app下的name字段,寫成publisher__name

      >>>?Book.objects.filter(publisher__name='BaloneyPress').count()

      73

      #?Average?price?across?all?books.

      >>>?from?django.db.models?import?Avg

      >>>?Book.objects.all().aggregate(Avg('price'))

      {'price__avg':?34.35}

      #?Max?price?across?all?books.

      >>>?from?django.db.models?import?Max

      >>>?Book.objects.all().aggregate(Max('price'))

      {'price__max':?Decimal('81.20')}

      1

      先介紹F,annotate 必用F

      -個F()對象表示一個模型字段或注釋的列的值。這樣就可以引用模型字段值并使用它們執(zhí)行數(shù)據(jù)庫操作,而無需實(shí)際將它們從數(shù)據(jù)庫中拉出到Python內(nèi)存中

      說白了就是我從數(shù)據(jù)庫拿東西,但是有些需要的字段沒有,要通過綁定的外鍵的app的model拿。但是名稱又是app__字段來命名,這樣我要改名稱,而且拿第一次的model,放在python內(nèi)存中,再拿通過外鍵綁定的另一個model,又要執(zhí)行第一次步驟,那個效率就不行了,干嘛我不一起拿,所以會用annotate可以提高效率

      from?django.db.models?import?F

      banners?=?Banner.objects.values('image_url',?'news_id').annotate(news_title=F('news__title')).filter(is_delete=False)

      1

      我要拿出image_url,news_id,和news_title,news_title來源banner模型外鍵綁定news中的title字段,拿出來它叫news__title,我要給它換個名字叫news_title,這就是注釋。

      Django 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:對選定區(qū)域進(jìn)行排序 出現(xiàn)圖2的情況 是什么回事 麻煩知道的告知一下 謝謝
      下一篇:Excel進(jìn)行加減乘除的具體方法
      相關(guān)文章
      亚洲日产乱码一二三区别| 久久精品国产亚洲一区二区三区| 亚洲精品亚洲人成人网| 国产午夜亚洲精品不卡电影| 亚洲hairy多毛pics大全| 91亚洲国产在人线播放午夜| 久久久青草青青亚洲国产免观 | 亚洲卡一卡2卡三卡4麻豆| 亚洲视频网站在线观看| 亚洲精品视频在线播放| 亚洲黄色三级网站| 久久亚洲私人国产精品vA| 久久精品国产亚洲AV大全| 久久精品国产亚洲av影院| 亚洲老熟女@TubeumTV| 亚洲精品美女久久久久9999| 亚洲成a人片在线观看播放| 亚洲三级中文字幕| 亚洲AV无码一区二区三区人| 亚洲无mate20pro麻豆| 亚洲性色AV日韩在线观看| 亚洲国产精品成人AV在线| 日韩色日韩视频亚洲网站| 亚洲第一区在线观看| MM131亚洲国产美女久久| 亚洲色成人中文字幕网站 | 中文日韩亚洲欧美制服| 亚洲精品国产av成拍色拍| 国产亚洲综合一区二区三区| 亚洲欧洲久久av| 人人狠狠综合久久亚洲婷婷| 亚洲国产精品久久久久久| 亚洲第一成年网站大全亚洲| 亚洲av产在线精品亚洲第一站| 亚洲日产乱码一二三区别| 亚洲国产精品综合久久网络| 亚洲人精品午夜射精日韩| 久久亚洲AV成人出白浆无码国产| 亚洲另类精品xxxx人妖| 亚洲久热无码av中文字幕| 亚洲国产精品一区二区第四页|