restframework之序列化


序列化

序列化用於對用戶請求數據進行驗證和數據進行序列化(為了解決queryset序列化問題)。

那什么是序列化呢?序列化就是把對象轉換成字符串,反序列化就是把字符串轉換成對象

Django 序列化

serialze 只能做序列化

from django.core.serializers import serialize

publish_list=Publish.objects.all()

        #方式1: Django的序列化組件

        # ret=serialize("json",publish_list)

 

我們用postman 幫我們提交數據

 

restframework 序列化(不只做序列化,可以集成)

 

如果是瀏覽器就是看到這個頁面,如果是其他ajax就顯示數據

 

 

具體代碼

一,#  自定義序列化組件

Serializers

from rest_framework import serializers

#先把字段寫出來

class BookSerializers(serializers.Serializer):

    title=serializers.CharField()

    price=serializers.CharField()

    publishDate=serializers.DateField()

 

    #   針對一對多

    publish=serializers.CharField(source="publish.name")

    publish_email=serializers.CharField(source="publish.email")

    #   針對多對多

    authors=serializers.SerializerMethodField()

    def get_authors(self,obj):

        data=[]

        for i in obj.authors.all():

            temp=[]

            temp.append(i.pk)

            temp.append(i.name)

            data.append(temp)

        return data

 

 

 

class PublishSerializers(serializers.Serializer):

    """

    PublishSerializers組件是一個集成功能組件,到底用什么功能,取決於調用什么接口

    """

    name=serializers.CharField()  # 普通字段

    city=serializers.CharField()

    # email=serializers.EmailField()

 

 

'''

ps=PublishSerializers(publish_list,many=True)

# 序列化數據

return Response(ps.data)

 

解析:

    data=[]

    for obj in publish_list:

        data.append({

            "name":obj.name,

            "city":obj.city,

            "email":obj.email,

            "publish":obj.publish.email,

             # if 字段是多對多字段:

             "authors":get_authors(obj)

 

 

        })

 

    self.data=data

 

 

'''

 
View Code

view

from app01.models import *

from django.core.serializers import serialize

from rest_framework.views import  APIView

 

from app01.serializers import PublishSerializers,BookSerializers,AuthorSerializers

 

 

from rest_framework.response import Response  # 響應器

class PublishView(APIView):

 

    def get(self,request):

        publish_list=Publish.objects.all()

 

        #方式1: Django的序列化組件

        # ret=serialize("json",publish_list)

 

        # 方式2:rest的序列化

        ps=PublishSerializers(publish_list,many=True)# many=True:不僅僅是序列化queryset,還有model

        # 序列化數據

 

        return Response(ps.data)

 

    def post(self,request):

        pass

 

"""  "books"   GET:獲取所有數據

            POST:添加一條數據

 

      "book/1"  GET:獲取單條數據

            DELETE:刪除一條數據

            PUT/PATCH:更新一條數據

 

""""

class BookView(APIView):

 

    def get(self, request):

        book_list = Book.objects.all()

 

        # 方式1: Django的序列化組件

        # ret=serialize("json",publish_list)

        # 方式2:rest的序列化

        bs = BookSerializers(book_list, many=True)# many=True:不僅僅是序列化queryset,還有model

        # 序列化數據

 

        return Response(bs.data)

 

    def post(self, request):

 

        # 添加一條數據

        print(request.data)

          # 添加數據

        bs=BookSerializers(data=request.data)

        if bs.is_valid(): #校驗字段接口

            bs.save()  # 生成記錄

            return Response(bs.data)# 序列化接口

        else:

 

            return Response(bs.errors)

 

class BookDetailView(APIView):

 

 

    def get(self,request,pk):

        book_obj=Book.objects.filter(pk=pk).first()

        bs=BookSerializers(book_obj,many=False)

 

        return Response(bs.data)

 

    def put(self,request,pk):

        book_obj = Book.objects.filter(pk=pk).first()

 

  # 更新數據

        bs=BookSerializers(data=request.data,instance=book_obj)

        if bs.is_valid():

            bs.save() # update

            return Response(bs.data)

        else:

            return Response(bs.errors)

 

    def delete(self,request,pk):

        Book.objects.filter(pk=pk).delete()

 

        return Response("")
View Code 

二, ModelSerializer  (不想寫字段,可以直接繼承)序列化組件

from app01.models import *

class PublishSerializers(serializers.ModelSerializer):

    class Meta:

        model=Publish

        exclude=("nid",)

 

from app01.models import *

class BookSerializers(serializers.ModelSerializer):

    class Meta:

        model=Book

        fields="__all__"

 

    # publish = serializers.CharField(source="publish.name")

    # authors=serializers.SerializerMethodField()

    # def get_authors(self,obj):

    #     data=[]

    #     for i in obj.authors.all():

    #         temp=[]

    #         temp.append(i.pk)

    #         temp.append(i.name)

    #         data.append(temp)

    #     return data

 

 

class AuthorSerializers(serializers.ModelSerializer):

    class Meta:

        model=Author

        fields="__all__"

 
View Code

 

Model 部分:

class Course(models.Model):

    title=models.CharField(max_length=32)

 

from django.db import models

 

# Create your models here.

 

 

class Author(models.Model):

    nid = models.AutoField(primary_key=True)

    name=models.CharField( max_length=32)

    age=models.IntegerField()

 

    # 與AuthorDetail建立一對一的關系

    authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE)

 

    def __str__(self):

        return self.name

 

class AuthorDetail(models.Model):

 

    nid = models.AutoField(primary_key=True)

    birthday=models.DateField()

    telephone=models.BigIntegerField()

    addr=models.CharField( max_length=64)

 

    def __str__(self):

        return str(self.telephone)

 

class Publish(models.Model):

    nid = models.AutoField(primary_key=True)

    name=models.CharField( max_length=32)

    city=models.CharField( max_length=32)

    email=models.EmailField()

 

    def __str__(self):

        return self.name

 

class Book(models.Model):

 

    nid = models.AutoField(primary_key=True)

    title = models.CharField( max_length=32)

    publishDate=models.DateField()

    price=models.DecimalField(max_digits=5,decimal_places=2)

 

    # 與Publish建立一對多的關系,外鍵字段建立在多的一方

    publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE)

    # 與Author表建立多對多的關系,ManyToManyField可以建在兩個模型中的任意一個,自動創建第三張表

    authors=models.ManyToManyField(to='Author',)

 

    def __str__(self):

        return self.title

 

 
View Code

url

urlpatterns = [

    url(r'^admin/', admin.site.urls),

 

    url(r'^login/$', views.LoginView.as_view()),

    url(r'^courses/$', views.CourseView.as_view()),

    url(r'^publishes/$', views.PublishView.as_view()),

    url(r'^books/$', views.BookView.as_view()),

    url(r'^books/(?P<pk>\d+)/$', views.BookDetailView.as_view()),

 

    url(r'^authors/$', views.AuthorView.as_view()),

    url(r'^authors/(?P<pk>\d+)/$', views.AuthorDetailView.as_view()),

]
View Code

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM