python學習-- Django REST framework 序列化數據操作
阿新 • • 發佈:2019-03-18
如何 ive 使用 str bsp 返回 時間 改變 新聞
一.為什麽要返回json數據?
一般來說前端要用到從後臺返回的數據來渲染頁面的時候,這時候後臺就需要向前端返回json類型的數據,簡單直觀便於理解 ,就類似於
{"xxx":{["name":xxx,"age":xxx}],[],[]}
這種格式的數據,那麽django是如何返回這種類型的數據的呢?
二. 方法
1.簡單好用的values
# 這是用django自帶的模型新建的兩張表新聞表和新聞標簽表,有註釋請自行理解,已經往表裏存了數據
class News (models.Model):
# 標題
title = models.CharField(max_length=50,null=False)
# 描述
desc=models.CharField(max_length=400,null=False)
# 內容
content=models.TextField()
# 新聞縮略圖 url
thumbnail_url=models.URLField()
# 和前面的真刪假刪一樣
is_delete=models.BooleanField(default=True)
# 新聞發布時間 清醒時間和幼稚時間 數據庫存進去時候的時間是零時區的UTC 時間,但是取出來的時間可以通過一些方法改變成正常時間
pub_time=models.DateTimeField(auto_now_add=True)
# 外鍵關聯 on_delete=models.SET_NULL 表示如果你刪除了作者或者是標簽,那麽這條新聞的作者或者標簽就設置為空
tag=models.ForeignKey(‘NewsTags‘,on_delete=models.SET_NULL,null=True)
author=models.ForeignKey(‘authpro.User‘,on_delete=models.SET_NULL,null=True)
class Meta:
ordering=[‘-pub_time‘]
# 新聞標簽表
class NewsTags(models.Model):
name = models.CharField(max_length=20)
## 真刪和假刪
# 真刪 :物理刪除 delete() 直接從數據庫裏刪除
# 假刪:邏輯刪除 update(is_delete=false) , 還在數據庫裏存著
is_delete=models.BooleanField(default=True)
現在我需要獲取全部的新聞,那麽我就需要在view裏這樣寫
from .models import News, NewsTags # 導入兩張表
news = News.object.all()
print(news)
# 結果 返回一個queryset 對象
# <QuerySet [<News: News object (14)>, <News: News object (13)>, <News: News object (12)>, <News: News object (11)>]...>
# 然後用到django為我們提供的方法 values
news_list = news.values()
print(news_list)
#得到結果 <QuerySet [{"id":1},{"id":2}]...> 還是一個queryset對象
#然後我們再來用list()方法強制轉換一下
entry_list = list(news_list)
print(entry_list)
# 結果 [ {"id":1}, {"id":2} ],這時我們已經得到了我們想要的格式
如果我們想要傳單條數據呢,這時候我們就可以去遍歷了
for news in entry_list:
print(news)
# 結果 這時的news 就是像{"id":1,"name":xxx} 這樣的對象了
但是我們這樣還是有問題,我們取到的對象他的外鍵字段就成了"tag_id":1,"author_id":2,這種形式,這顯然不是我們想要的,而我們想要的形式卻是"tag":標簽名稱,"author":作者名 這種的,所以我們就還需要根據id 查詢出tag,和autho 所對應的標簽名和作者名
tagid = news["tag_id"]
tag = NewTags.object.filter(tagid).first()
tagname=tag.name
news["tag_name"]=tagname
# 這樣再次傳輸的時候就有了,"tag_name":標簽名 這樣的字段了,作者也是如此
至此,第一種方法values就算完成了,但是劣勢我們也看出來了,在當表關系比較復雜的時候,還需要進行查詢,比較麻煩,因此這種方法只適用於單表的時候,下面我們來介紹當多表的時候采用的方法。
2. djangoRestFramework
這裏是官方鏈接 djangoRestFramework
用法很簡單
1. 在我們項目環境中安裝
pip install djangorestframework
2. 註冊app
INSTALLED_APPS = [
...
‘rest_framework‘,
]
3.序列化
image.png然後在這個文件裏,寫我們要序列化的表,和字段就ok了
from rest_framework import serializers # 要用到的包
from .models import NewsTags, News # 導入這兩張表
from app.authpro.serializers import Userserializer # 同樣的方法在authpro 這個app下新建Userserializer文件
class Newstagserializer(serializers.ModelSerializer):
class Meta:
model = NewsTags
fields = ("id","name", "is_delete")
class Newsserializer(serializers.ModelSerializer): # 繼承這個玩意就可以
tag = Newstagserializer() #外鍵只需要將序列化後的表實例化,這是上面Newstagserializer 的實例
author = Userserializer() # 這是 Userserializer 的實例
class Meta:
#表名
model = News
# 字段名
fields = ("id","title", "desc", "content", "thumbnail_url", "is_delete", "pub_time", "tag", ‘author‘)
4. 使用
#在當前視圖中導入
from .serializers import Newsserializer
from django.http import JsonResponse
def news_list(request):
#查數據,和第一種方法查數據的時候一樣
news = News.object.all()
# 後臺返回數據
serializer = Newsserializer(news,many=True) # 註意多條數據的時候要加many=True
return JsonResponse({“data”:{"news":serialzer.data}})
5. 大功告成,哈哈哈
以上就是django後臺向前端兩種返回json格式數據的方法。
python學習-- Django REST framework 序列化數據操作