Django REST framework 序列化

創建一個序列化類

使用序列化有四種方式

  • 使用json模塊,完全手寫
  • 使用django自帶的序列化模塊 1,# from django.core import serializers? ?2,# data=serializers.serialize(“json”,book_list)
  • 使用REST framework 帶的序列化方法,但是自己寫規則? BookSerializers(serializers.Serializer)
  • 使用REST framework 帶的序列化方法,不自定義,完全使用模塊 BookSerializers(serializers.ModelSerializer)

開發我們的Web API的第一件事是為我們的Web API提供一種將代碼片段實例序列化和反序列化為諸如json之類的表示形式的方式。我們可以通過聲明與Django forms非常相似的序列化器(serializers)來實現。

models部分:

from django.db import models# Create your models here.
class Book(models.Model):title=models.CharField(max_length=32)price=models.IntegerField()pub_date=models.DateField()publish=models.ForeignKey("Publish")authors=models.ManyToManyField("Author")def __str__(self):return self.titleclass Publish(models.Model):name=models.CharField(max_length=32)email=models.EmailField()def __str__(self):return self.nameclass Author(models.Model):name=models.CharField(max_length=32)age=models.IntegerField()def __str__(self):return self.name

views部分:

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import *
from django.shortcuts import HttpResponse
from django.core import serializers
from rest_framework import serializers# 方式三,自己定義序列化的規則
class BookSerializers(serializers.Serializer):?????????? title=serializers.CharField(max_length=32)price=serializers.IntegerField()pub_date=serializers.DateField()publish=serializers.CharField(source="publish.name")? # 一對多,序列化時如果想要指定字段,需要使用參數source,跨表用.#authors=serializers.CharField(source="authors.all")authors=serializers.SerializerMethodField()?????????? # 多對多時,自定義字段字段def get_authors(self,obj):?? # 名字固定寫法 get_*temp=[]for author in obj.authors.all():temp.append(author.name)return tempclass Meta:model=Book fields=['title','price','pub_date','authors']# 鉤子函數def validate_title(self, value):if '草' in value:raise ValidationError('不符合社會主義核心價值觀')return valueclass BookViewSet(APIView):def get(self,request,*args,**kwargs):book_list=Book.objects.all()# 序列化方式1 自己手寫json:# from django.forms.models import model_to_dict# import json# data=[]# for obj in book_list:#???? data.append(model_to_dict(obj))# print(data)# return HttpResponse("ok")# 序列化方式2,使用django自帶的序列化模塊:# from django.core import serializers# data=serializers.serialize("json",book_list)# return HttpResponse(data)# 序列化方式3,使用REST framework 帶的序列化方法,但是自己寫規則:bs=BookSerializers(book_list,many=True)return Response(bs.data)# 序列化方式4,使用REST framework 帶的序列化方法,不自定義,完全使用模塊,如下

ModelSerializer

# ModelSerializer 繼承自 Serializer
class BookSerializers(serializers.ModelSerializer):       # 不自定義,完全使用模塊class Meta:model=Bookfields="__all__"depth=1  # 表的深度,即使用一對多,多對多時,跨表的深度extra_kwargs = {"tag": {"error_messages": {"does_not_exist": '"{pk_value}"對應的tag對象不存在。'}}}

在視圖中使用序列化類

提交post(添加)請求

def post(self,request,*args,**kwargs):bs=BookSerializers(data=request.data,many=False)  # 實例化 ,many=false 是實例一個對象,many=true 是實例化quersetif bs.is_valid():# print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

單條數據的get(查詢一條)和put(更新一條)請求

class BookDetailViewSet(APIView):def get(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj)return Response(bs.data)def put(self,request,pk):book_obj=Book.objects.filter(pk=pk).first()bs=BookSerializers(book_obj,data=request.data) # 有data參數,調用save是更新操作if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)

重寫save中的create方法

重寫create方法,當你要對某一個字段進行操作的時候,不能用父類的create方法,source不能被解析出來

class BookSerializers(serializers.ModelSerializer):class Meta:model=Bookfields="__all__"# exclude = ['authors',]# depth=1def create(self, validated_data):authors = validated_data.pop('authors')obj = Book.objects.create(**validated_data)obj.authors.add(*authors)return obj

自定義驗證

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from .. import modelsclass PasswordValidator(object):def __init__(self, base):self.base = str(base)def __call__(self, value):if value != self.base:message = 'This field must be %s.' % self.baseraise serializers.ValidationError(message)def set_context(self, serializer_field):# 執行驗證之前調用,serializer_fields是當前字段對象passclass ModelUserSerializer(serializers.ModelSerializer):user = serializers.CharField(max_length=32)class Meta:model = models.UserInfofields = "__all__"# fields = ['user', 'pwd', 'ut']depth = 2extra_kwargs = {'user': {'min_length': 6},'pwd': {'validators': [PasswordValidator(666), ]}}# read_only_fields = ['user']

超鏈接API:Hyperlinked

class BookSerializers(serializers.ModelSerializer):publish= serializers.HyperlinkedIdentityField(view_name='publish_detail', # 反向解析lookup_field="publish_id",  # 這里是取這個id值,當你循環到那個外鍵的那個id值的值的時候,作為參數傳進去lookup_url_kwarg="pk")      # 把還是那個面的id作為參數傳進去,就是在url路由里面的有名分組class Meta:model=Bookfields="__all__"#depth=1

urls部分:

urlpatterns?=?[url(r'^books/$', views.BookViewSet.as_view(),name="book_list"),    # 需要加name參數url(r'^books/(?P<pk>\d+)$', views.BookDetailViewSet.as_view(),name="book_detail"),url(r'^publishers/$', views.PublishViewSet.as_view(),name="publish_list"),url(r'^publishers/(?P<pk>\d+)$', views.PublishDetailViewSet.as_view(),name="publish_detail"),
]

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454456.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454456.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454456.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于SIMD的AVS整數反變換算法設計與優化

基于SIMD 的AVS 整數反變換算法設計與優化王玲娟&#xff0c;張剛**作者簡介&#xff1a;王玲娟&#xff0c;&#xff08;1987-&#xff09;&#xff0c;女&#xff0c;在讀碩士&#xff0c;主要研究方向&#xff1a;視頻解碼算法通信聯系人&#xff1a;張剛&#xff0c;&#…

Word -- 列表重新編號

Word -- 列表重新編號office一言&#xff1a;我小心翼翼地灌溉&#xff0c;一日復一日地期待&#xff0c;那么費力&#xff0c;植成參天的喬木&#xff0c;豈愿見你終有一日從容赴死&#xff1f;問題 word 文檔早就想解決的一個問題&#xff0c;這次遇到了就上網找解決掉了&…

非持久連接和持久連接

非持久連接和持久連接 HTTP既可以使用非持久連接(nonpersistent connection)&#xff0c;也可以使用持久連接(persistent connection)。HTTP/1.0使用非持久連接&#xff0c;HTTP/1.1默認使用持久連接。 非持久連接 讓我們查看一下非持久連接情況下從服務器到客戶傳送一個Web頁面…

計算機開機鍵鼠無法識別,我得電腦一開機就檢測不到鍵盤和鼠標

2005-10-18 16:06:131、開機后當出現dos界面時&#xff0c;按一下pause鍵(這個鍵在四個方向鍵的上邊&#xff0c;仔細找就能找到)&#xff0c;如果計算機啟動停止&#xff0c;說明你的鍵盤起作用&#xff0c;主板在開機時就已經檢測到了鼠標鍵盤。啟動后不能使用鼠標鍵盤&#…

vs2003 局部友元訪問私有不可訪問_C++ 類:重載運算符與友元

18.類中重載運算符與友元上次節中學習了如何在類中重新定義賦值()運算符&#xff0c;實際上在一個自定義類中除了賦值()運算符外&#xff0c;類的對象是不可以直接使用運算符的&#xff0c;比如你在main函數中寫這樣的代碼會報錯&#xff1a;如果想解決這些報錯問題&#xff0c…

oracle sqlldr (一) 最基本語法

-- Create table create table DEPT2 (DEPTNO NUMBER(2) not null,DNAME VARCHAR2(14),LOC VARCHAR2(1000) ); alter table DEPT2add constraint DEPT_PK primary key (DEPTNO);------demo.ctl LOAD DATA INFILE * --數據在控制文件中 INTO TABLE DEPT2 INSERT ---默認加…

Django REST framework 視圖

上一部分代碼在序列化部分 類繼承順序 ############### mixins.py ################ # 類中調用的方法均在 GenericAPIView 類中實現&#xff0c;所以下列類需要結合 GenericAPIView 使用 class ListModelMixin(object) # 查看繼承類def list(self, reque…

AVS軟件解碼器的優化

AVS軟件解碼器的優化 董斌 , 姜昱明 (西安 電子科技大學計算機學院,陜西 西安,710071)) 摘 要: 主要研究了AVS標準的視頻壓縮部分,指出了影響解碼速度的瓶頸并提出了一種優化方案.使用從程序結構入手結合使用SIMD指令集的方案來優化AVS軟件解碼器.實驗結果表明優化方案可行并且…

IOS7.1.1真的像網上流傳的那么好?沒有任何問題么??

IOS7.1.1推送更新之后到處看到網上說711好的~~ 那么IOS7.1.1真的像網上現在流傳的那么好么&#xff1f; 其實不然&#xff0c;IOS7.1.1目前眾多網友反映說升級ios7.1.1之后APPstore連接不上了&#xff0c;提示無法連接到APPstore。 這個問題也不難解決~還是之前的老辦法~ 那么今…

三校生計算機對口本科有哪些學校,寶山三校生五月對口高考報名

多次復習生活不可能像你想象得那么好&#xff0c;但也不會像你想象得那么糟。我覺得人的脆弱和堅強都超乎自己的想象。多種方式結合起來復習單一的復習方法&#xff0c;易產生消極情緒和疲勞&#xff0c;如果采用交談復習法、討論復習法、自我檢查復習法多樣化的復習方法&#…

localhost 已拒絕連接_【Python】MongoDB數據庫的連接和操作

安裝Python 要連接 MongoDB 需要 MongoDB 驅動。pip安裝&#xff1a;python3 -m pip3 install pymongo創建數據庫import pymongo myclient pymongo.MongoClient("mongodb://localhost:27017/")mydb myclient["loaderman"]注意: 在 MongoDB 中&#xff0c…

checkbox已設置為checked--true-但不勾選問題解決方法(只第一次勾選有效)

一、出現的問題及解決方法&#xff1a; 今天在寫一個table相關插件的時候無意中發現了這樣一個問題&#xff0c;記得以前在寫這種控制checkbox選中與非選中的代碼時并沒有這種bug&#xff0c;當時也是用的checked屬性&#xff0c;而現在卻行不通了。 于是乎做了以下測試&#x…

Python 錯誤和異常小結[轉]

原文鏈接 http://blog.csdn.net/sinchb/article/details/8392827 事先說明哦&#xff0c;這不是一篇關于Python異常的全面介紹的文章&#xff0c;這只是在學習Python異常后的一篇筆記式的記錄和小結性質的文章。什么&#xff1f;你還不知道什么是異常&#xff0c;額... 1.Py…

Django REST framework 認證、權限和頻率組件

認證與權限頻率組件 身份驗證是將傳入請求與一組標識憑據&#xff08;例如請求來自的用戶或其簽名的令牌&#xff09;相關聯的機制。然后 權限 和 限制 組件決定是否拒絕這個請求。 簡單來說就是&#xff1a; 認證確定了你是誰權限確定你能不能訪問某個接口限制確定你訪問某…

高速率AVS整數變換的匯編實現與優化

1 引言 AVS標準Ⅲ采用的8x8整數變換在獲得較H&#xff0e;264更高的壓縮率和主觀圖像質量的同時&#xff0c;增加了算法的實現復雜性和時間開銷。本文重點研究AVS編解碼器的整數變換模塊&#xff0c;針對不同的算法實現模式&#xff0c;在原有Visual C6&#xff0e;0整數變換模…

計算機與廣播電視論文,淺談廣播電視中計算機技術的作用論文.pdf

1、計算機技術在廣播電視的媒體內容中有重要應用在以往的廣播電視中&#xff0c; 媒體內容主要分為音頻和視頻兩種信號&#xff0c; 在傳輸的過程中使用的是模擬信號&#xff0c; 但模擬信號受到的外界干擾因素較為明顯&#xff0c; 因此廣播電視傳播的媒體內容受到影響&#x…

opencv安裝教程python3.7_Mac下安裝使用Python-OpenCV,解決opencv3安裝完成無法使用的問題 - pytorch中文網...

OpenCV是一個跨平臺計算機視覺庫&#xff0c;可以運行在Linux、Windows、Android和Mac OS操作系統上。提供了Python、Ruby、MATLAB等語言的接口&#xff0c;實現了圖像處理和計算機視覺方面的很多通用算法。 Mac安裝OpenCV 在我們的深度學習的過程中&#xff0c;對于圖像&#…

NodeJS在CentOs7下安裝

node下載地址:https://nodejs.org/en/download/ 1.安裝gcc $ yum install gcc-c 2.解壓最新版本 $ mkdir /usr/local/node$ tar zxvf node-v6.11.4.tar.gz $ cd node-v6.11.4$ ./configure --prefix/usr/local/node# 在當前目錄下編譯安裝Node$ make$ make install 3.驗證安裝 …

Python功能之反射

有如下文件: index.py 1<span style"font-family:宋體, SimSun;">#!/usr/bin/env python<br data-filtered"filtered"># -*- coding:utf-8 -*-<br data-filtered"filtered">__author__ ryan<br data-filtered"filter…

Django REST framework 分頁

分頁模式 rest framework中提供了三種分頁模式&#xff1a; from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination, CursorPagination 全局配置 REST_FRAMEWORK {DEFAULT_PAGINATION_CLASS: rest_framework.pagination.LimitOffsetPaginat…