Django REST framework 序列化
生活随笔
收集整理的這篇文章主要介紹了
Django REST framework 序列化
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
創(chuàng)建一個(gè)序列化類
使用序列化有四種方式
- 使用json模塊,完全手寫
- 使用django自帶的序列化模塊 1,# from django.core import serializers? ?2,# data=serializers.serialize(“json”,book_list)
- 使用REST framework 帶的序列化方法,但是自己寫規(guī)則? BookSerializers(serializers.Serializer)
- 使用REST framework 帶的序列化方法,不自定義,完全使用模塊 BookSerializers(serializers.ModelSerializer)
開發(fā)我們的Web API的第一件事是為我們的Web API提供一種將代碼片段實(shí)例序列化和反序列化為諸如json之類的表示形式的方式。我們可以通過聲明與Django forms非常相似的序列化器(serializers)來實(shí)現(xiàn)。
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.nameviews部分:
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# 方式三,自己定義序列化的規(guī)則 class BookSerializers(serializers.Serializer):?????????? title=serializers.CharField(max_length=32)price=serializers.IntegerField()pub_date=serializers.DateField()publish=serializers.CharField(source="publish.name")? # 一對多,序列化時(shí)如果想要指定字段,需要使用參數(shù)source,跨表用.#authors=serializers.CharField(source="authors.all")authors=serializers.SerializerMethodField()?????????? # 多對多時(shí),自定義字段字段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']# 鉤子函數(shù)def validate_title(self, value):if '草' in value:raise ValidationError('不符合社會(huì)主義核心價(jià)值觀')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 帶的序列化方法,但是自己寫規(guī)則: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 # 表的深度,即使用一對多,多對多時(shí),跨表的深度extra_kwargs = {"tag": {"error_messages": {"does_not_exist": '"{pk_value}"對應(yīng)的tag對象不存在。'}}}在視圖中使用序列化類
提交post(添加)請求
def post(self,request,*args,**kwargs):bs=BookSerializers(data=request.data,many=False) # 實(shí)例化 ,many=false 是實(shí)例一個(gè)對象,many=true 是實(shí)例化quersetif bs.is_valid():# print(bs.validated_data)bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)單條數(shù)據(jù)的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參數(shù),調(diào)用save是更新操作if bs.is_valid():bs.save()return Response(bs.data)else:return HttpResponse(bs.errors)重寫save中的create方法
重寫create方法,當(dāng)你要對某一個(gè)字段進(jìn)行操作的時(shí)候,不能用父類的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自定義驗(yàn)證
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):# 執(zhí)行驗(yàn)證之前調(diào)用,serializer_fields是當(dāng)前字段對象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", # 這里是取這個(gè)id值,當(dāng)你循環(huán)到那個(gè)外鍵的那個(gè)id值的值的時(shí)候,作為參數(shù)傳進(jìn)去lookup_url_kwarg="pk") # 把還是那個(gè)面的id作為參數(shù)傳進(jìn)去,就是在url路由里面的有名分組class Meta:model=Bookfields="__all__"#depth=1urls部分:
urlpatterns?=?[url(r'^books/$', views.BookViewSet.as_view(),name="book_list"), # 需要加name參數(shù)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"), ]?
總結(jié)
以上是生活随笔為你收集整理的Django REST framework 序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试简历中的项目应该如何准备?
- 下一篇: 串口屏如何调用键盘