1. 程式人生 > 其它 >Django自帶的序列化元件serialize

Django自帶的序列化元件serialize

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}}]

'''

# 我們可以看到它幫我們處理的資料是非常全面的,
# 告訴了我們這個資料來自於哪一個應用下的拿一張表,還告訴了我們對應的主鍵值,和詳細資訊