Django自帶的序列化元件serialize
阿新 • • 發佈:2022-03-08
django自帶的序列化元件serialize
引子:
# 前後端分離的專案
作為後端開發的我們只需要寫程式碼將資料處理好
能夠序列化返回給前端即可
再寫一個介面文件 告訴前端每個欄位代表的意思即可
前端對資料做處理也是比較麻煩的。
# 所以我們在寫前後端分離專案的時候,要想讓前端頁面也能夠識別到後端的資料,那就要用到json格式的資料來進行互動。
準備工作:
models.py
class User(models.Model): username = models.CharField(max_length=32) age = models.IntegerField() gender_choice = ( (1,'male'), (2,'female'), (3,'others') ) gender = models.IntegerField(choices=gender_choice)
在講解序列化元件之前我們先來看一個例子:
# 需求:在前端獲取到後端使用者表裡面所有的資料 並且要是列表套字典的格式
# 我們先用我們基礎階段的知識來完成這個效果:
http頁面
<body>
{% for user_obj in user_list %}
<p>{{ user_obj }}</p>
{% endfor %}
</body>
views.py
from django.http import JsonResponse # 匯入JsonResponse模組 from app01 import models def ab_ser(request): user_queryset = models.User.objects.all() # 查詢所有的資料物件 user_list = [] # 建立一個空列表 for user_obj in user_queryset: # 迴圈出每一個數據物件 tmp = { # 利用物件點的方式取出每一個對應元素來充當欄位的值 'pk':user_obj.pk, 'username':user_obj.username, 'age':user_obj.age, 'gender':user_obj.gender } user_list.append(tmp) # 新增到列表中 return JsonResponse(user_list, safe=False) # 轉換成json格式返回給前端頁面(safe屬性為ture則表示只能傳dict字典的形式,因為現在為列表的形式,所以改為False)
# 這樣就可以返回給前端我們需要的格式(列表套字典的格式)資訊。 [ {"pk": 1, "username": "gary", "age": 19, "gender": 1}, {"pk": 2, "username": "tom", "age": 20, "gender": 2}, {"pk": 3, "username": "kevin", "age": 29, "gender": 3}, {"pk": 4, "username": "jack", "age": 38, "gender": 4} ] # 這樣寫是不是非常的麻煩,如果欄位非常的多 我們還要把所有的欄位,欄位對應的值拿出來,並且如果新增新的欄位,我們還需要手動來操作新增新的鍵值對。 # 我們在寫前後端分離的時候,有很多專門為我們做序列化元件的模組,我們這裡來介紹一個:
序列化模組serialize
# 格式:serializers.serialize('序列化成什麼格式',資料)
# 示例:
from django.core import serializers # 匯入
def ab_ser(request):
user_queryset = models.User.objects.all()
res = serializers.serialize('json',user_queryset) # 序列化成json格式資料
"""會自動幫你將資料變成json格式的字串 並且內部非常的全面"""
return HttpResponse(res) # 返回給前端頁面
'''
[{"model": "app01.user",
"pk": 1,
"fields": {"username": "gary", "age": 19, "gender": 1}},
{"model": "app01.user",
"pk": 2,
"fields": {"username": "tom", "age": 20, "gender": 2}},
{"model": "app01.user",
"pk": 3,
"fields": {"username": "kevin", "age": 29, "gender": 3}},
{"model": "app01.user",
"pk": 4,
"fields": {"username": "jack", "age": 38, "gender": 4}}]
'''
# 我們可以看到它幫我們處理的資料是非常全面的,
# 告訴了我們這個資料來自於哪一個應用下的拿一張表,還告訴了我們對應的主鍵值,和詳細資訊