接下來會用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
)功能。