iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
Modern Web

Django 初心者之旅系列 第 27

【Day 27】Django QuerySet 補充篇(1) - Introduction & Get Data

  • 分享至 

  • xImage
  •  

接下來會用2篇文章,好好的補充QuerySet的內容,有些內容前面或多或少都有提到過,這邊就當作再一次的複習吧! 身為初心者,反覆地刷怪練功是件很正常的事。 當然今天也會需要建立用來測試的網頁環境,不過先讓我們複習一下QuerySet是什麼東西吧! ヾ(´∀ ˋ)ノ

QuerySet

QuerySetDjango框架下,代表的是資料庫裡面的資料集合(collection),用比較實際的說法,QuerySet就是對應資料表(Table)上的所有資料紀錄(Record)。

QuerySet本身是個包含很多ObjectList,每個Object都是資料表的一筆紀錄(Record),透過QuerySetORM的幫忙,我們可以很容易地取得需要的資料,並對這些資料進行篩選(Filter)或排序(Order)。


Get Data

關於取得資料表資料紀錄的方式,在前面的文章有提到過2種。

  1. 如果希望在QuerySet看到單純的資料紀錄(Record) :
    資料表名稱.objects.all()
    
  2. 如果希望在QuerySet看到完整的資料紀錄(Record) :
    資料表名稱.objects.all().values()
    

實際操作

  1. 先到members/templates資料夾新增testing.html

  2. 然後到members/views.py裡面新增處理對testing.html發出請求的方法(view)。

    #其他東西不要改
    def testing(request):
      QuerySet_Simple = Members.objects.all()
      QuerySet_Detail = Members.objects.all().values()
      template = loader.get_template('testing.html')
      context = {
        'QuerySet_Simple': QuerySet_Simple, #只看得到有幾筆紀錄,但看不到實際資料
        'QuerySet_Detail': QuerySet_Detail, #看得到有幾筆紀錄和實際資料
      }
      return HttpResponse(template.render(context,request)) 
    
  3. 接著到members/urls.py新增到testing.html的路徑,再設定請求處理方法(view)、路徑別名。

    from django.urls import path
    from . import views
    
    urlpatterns = [
      path('', views.index, name='index'),
      path('add/', views.add, name='add'),
      path('add/addrecord/', views.addrecord, name='addrecord'),
      path('delete/<int:id>', views.delete, name='delete'),
      path('update/<int:id>', views.update, name='update'),
      path('update/updaterecord/<int:id>', views.updaterecord, name='updaterecord'),
      path('testing/', views.testing , name='testing') #新增這一行
    ]
    
  4. 修改testing.html的內容,讓它能在瀏覽器顯示2種不同的QuerySet

    <p>{{ QuerySet_Simple }}</p>
    <p>{{ QuerySet_Detail }}</p>
    
  5. 啟動Server並前往指定的網址127.0.0.1/members/testing就能看到不同的QuerySet囉。

    (如何啟動python虛擬環境和啟動Server就不在這邊再次說明,因為前面的內容都有提到)

    可以看到2種不同版本的QuerySet,上面的只能看到每筆資料紀錄(Record)的id,下面的可以看到每筆資料紀錄(Record)的詳細資料。

之前,我們有把Members資料表的資料紀錄(Record)放入表格內檢視,像下面這樣。

那我們可不可以只留下特定欄或列的資料呢? 答案是可以的。


取得特定欄(Column)的資料

透過values_list()這個方法,我們可以只留下特定的資料欄位。
members/views.py裡的方法testing改成下面這樣 :

#其他地方不要動
def testing(request):
  mydata = Members.objects.values_list('firstname')
  template = loader.get_template('testing.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
  • Members.objects.values_list('firstname')
    • values_list('欄位名稱')
    • 只留下Members資料表的firstname欄位

然後把testing.html改成下面這樣 :

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.0 }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html>    

接著啟動Server進入網址127.0.0.1/members/testing就會看到只剩下firstname欄位的資料。


取得特定列(Row)的資料

透過filter()這個方法,我們可以只留下特定列的資料。
members/views.py裡的方法testing改成下面這樣 :

#其他地方不要動
def testing(request):
  mydata = Members.objects.filter(firstname='Jimmy').values()
  template = loader.get_template('testing.html')
  context = {
    'mymembers': mydata,
  }
  return HttpResponse(template.render(context, request))
  • Members.objects.filter(firstname='Jimmy').values()
    • filter(資料篩選條件)
    • 只留下Members資料表上firstname欄位是Jimmy的資料

然後把testing.html改成下面這樣 :

<!DOCTYPE html>
<html>
<body>

<p>The queryset object:</p>

{{ mymembers }}

<p>Loop through the items:</p>

<table border='1'>
  {% for x in mymembers %}
    <tr>
      <td>{{ x.id }}</td>
      <td>{{ x.firstname }}</td>
      <td>{{ x.lastname }}</td>
    </tr>
  {% endfor %}
</table>

</body>
</html>  

接著啟動Server進入網址127.0.0.1/members/testing就會看到只剩下firstnameJimmy的資料。

今天我們複習如何取得資料表的資料,並且學會只取得特定欄或列資料的方法。明天會是Django QuerySet 補充篇的最後一篇,要來介紹QuerySet已經用過的的篩選(filter)功能和沒用過的排序(orderby)功能。


上一篇
【Day 26】 Django 客製化 404 頁面
下一篇
【Day 28】Django QuerySet 補充篇(2) - Filter & Order By
系列文
Django 初心者之旅31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言