接下來會用2篇文章,好好的補充QuerySet的內容,有些內容前面或多或少都有提到過,這邊就當作再一次的複習吧! 身為初心者,反覆地刷怪練功是件很正常的事。 當然今天也會需要建立用來測試的網頁環境,不過先讓我們複習一下QuerySet是什麼東西吧! ヾ(´∀ ˋ)ノ
QuerySet在Django框架下,代表的是資料庫裡面的資料集合(collection),用比較實際的說法,QuerySet就是對應資料表(Table)上的所有資料紀錄(Record)。
而QuerySet本身是個包含很多Object的List,每個Object都是資料表的一筆紀錄(Record),透過QuerySet和ORM的幫忙,我們可以很容易地取得需要的資料,並對這些資料進行篩選(Filter)或排序(Order)。

關於取得資料表資料紀錄的方式,在前面的文章有提到過2種。
資料表名稱.objects.all()
資料表名稱.objects.all().values()
先到members/templates資料夾新增testing.html。

然後到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))
接著到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') #新增這一行
]
修改testing.html的內容,讓它能在瀏覽器顯示2種不同的QuerySet。
<p>{{ QuerySet_Simple }}</p>
<p>{{ QuerySet_Detail }}</p>
啟動Server並前往指定的網址127.0.0.1/members/testing就能看到不同的QuerySet囉。
(如何啟動python虛擬環境和啟動Server就不在這邊再次說明,因為前面的內容都有提到)
可以看到2種不同版本的QuerySet,上面的只能看到每筆資料紀錄(Record)的id,下面的可以看到每筆資料紀錄(Record)的詳細資料。

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

那我們可不可以只留下特定欄或列的資料呢? 答案是可以的。
透過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))
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欄位的資料。

透過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))
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就會看到只剩下firstname是Jimmy的資料。

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