1. 程式人生 > >python學習-- Django REST framework 序列化數據操作

python學習-- Django REST framework 序列化數據操作

如何 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 序列化數據操作