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

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

QuerySet

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

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


Get Data

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

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

實際操作

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #其他東西不要改
    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)、路徑別名。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    1
    2
    <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改成下面這樣 :

1
2
3
4
5
6
7
8
#其他地方不要動
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改成下面這樣 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!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改成下面這樣 :

1
2
3
4
5
6
7
8
#其他地方不要動
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改成下面這樣 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!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)功能。

分享到