【DRF框架】利用序列化組件操做

使用序列化組件進行操做前端

不帶參數:查+增django

帶參數:查、改、刪框架

 

不帶參數的操做post

# url路由
url(r'^book_list/$',Search_book.as_view()),
# views.py
from utils.serializers import BookSerializer from .models import Book from rest_framework.response import Response from rest_framework.views import APIView class Search_book(APIView): # 查詢數據,GET請求
    def get(self,request): book_queryset = Book.objects.all() # 使用序列化器進行序列化,返回序列化對象
        ser_obj = BookSerializer(book_queryset,many=True)    # 多個queryset對象使用many=True

        # 返回數據
        return Response(ser_obj.data)           # 序列化好的數據都在 序列化對象.data

    # 新增數據,POST請求
    def post(self,request): # 對提交的數據進行反序列化,返回一個序列化對象
        ser_obj = BookSerializer(data=request.data) # 對序列化對象進行校驗
        if ser_obj.is_valid(): # 校驗經過,新增數據
            ser_obj.save()      # 調用序列化器的create()方法
            return Response(ser_obj.data)  # 返回新增的數據

        else: # 校驗不經過
            return Response(ser_obj.errors)
# 序列化器 # serializers.py
from rest_framework import serializers   # 導入框架的序列化器
from SerDemo.models import Book # 外鍵字段的序列化器
class PublisherSerializer(serializers.Serializer): # 根據外鍵模型的字段定義字段進行匹配
    id = serializers.IntegerField() title = serializers.CharField(max_length=32) # 多對多字段的序列化器
class AuthorSerializer(serializers.Serializer): # 根據多對多字段模型的字段定義字段進行匹配
    id = serializers.IntegerField() name = serializers.CharField(max_length=32) # 自定義驗證器
def my_validate(value): if "xxx" in value: raise serializers.ValidationError("該字段包含敏感詞!!!") else: return value class BookSerializer(serializers.Serializer): # 定義模型中須要序列化的字段,匹配的上的進行序列化,匹配不上的丟棄
    id = serializers.IntegerField(required=False)           # 反序列化不匹配該字段
    title = serializers.CharField(max_length=32,validators=[my_validate,])             # 使用自定義驗證器
    category = serializers.CharField(source='get_category_display',read_only=True)     # source經過ORM操做得到CHOICES的值
    category_post = serializers.IntegerField(write_only=True)                          # 用於反序列化的字段
    pub_time = serializers.DateField() # 外鍵字段,先聲明外鍵字段的序列化器再實例化
    publisher = PublisherSerializer(read_only=True)             # 僅在正序列化匹配該字段
    publisher_id = serializers.IntegerField(write_only=True)    # 僅在反序列化匹配該字段

    # 多對多字段,先聲明多對多字段的序列化器再實例化
    authors = AuthorSerializer(read_only=True,many=True)       # 多個模型對象使用many=True,正序列化匹配該字段
    authors_list = serializers.ListField(write_only=True)      # 反序列化匹配該字段



    # 新增對象調用create方法
    def create(self, validated_data): # validated_data 是數據的字典

        # 建立對象
        book_obj = Book.objects.create( title=validated_data.get('title'), category=validated_data.get('category_post'), pub_time = validated_data.get('pub_time'), publisher_id = validated_data.get('publisher_id'), ) book_obj.authors.add(*validated_data['authors_list'])       # 多對多字段使用add
 book_obj.save() return book_obj

 

帶參數的操做ui

# url路由
url(r'^book_list/(?P<id>\d+)/$',EditBookView.as_view())
from django.shortcuts import render from utils.serializers import BookSerializer from .models import Book from rest_framework.response import Response from rest_framework.views import APIView # 帶id的查詢、更新、刪除
class EditBookView(APIView): # 根據id查看數據
    def get(self,request,id): # 根據ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first() # 對模型對象進行序列化,返回序列化對象
        ser_obj = BookSerializer(book_obj) # 返回序列化對象的數據
        return Response(ser_obj.data) # 根據id更新數據
    def put(self,request,id): # 根據ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first() # 將獲取的數據根據模型對象進行序列化,返回序列化對象
        ser_obj = BookSerializer(instance=book_obj,data=request.data,partial=True) # partial=True 部分匹配
        # data=request.data 前端提交的數據
        # instance=book_obj根據id找到的實例化對象

        # 對實例化對象進行校驗
        if ser_obj.is_valid(): # 校驗經過,調用save進行更新
            ser_obj.save()      # 內部調用序列化器的update方法
            return Response(ser_obj.data) else: return Response(ser_obj.errors)     # 返回錯誤信息

    # 根據id刪除數據
    def delete(self,request,id): # 根據ip找到模型對象
        book_obj = Book.objects.filter(pk=id).first() if book_obj: book_obj.delete() return Response("刪除成功") else: return Response("刪除失敗")
# serializers.py
from rest_framework import serializers   # 導入框架的序列化器
from SerDemo.models import Book # 外鍵字段的序列化器
class PublisherSerializer(serializers.Serializer): # 根據外鍵模型的字段定義字段進行匹配
    id = serializers.IntegerField() title = serializers.CharField(max_length=32) # 多對多字段的序列化器
class AuthorSerializer(serializers.Serializer): # 根據多對多字段模型的字段定義字段進行匹配
    id = serializers.IntegerField() name = serializers.CharField(max_length=32) # 自定義驗證器
def my_validate(value): if "xxx" in value: raise serializers.ValidationError("該字段包含敏感詞!!!") else: return value class BookSerializer(serializers.Serializer): # 定義模型中須要序列化的字段,匹配的上的進行序列化,匹配不上的丟棄
    id = serializers.IntegerField(required=False)           # 反序列化不匹配該字段
    title = serializers.CharField(max_length=32,validators=[my_validate,])             # 使用自定義驗證器
    category = serializers.CharField(source='get_category_display',read_only=True)     # source經過ORM操做得到CHOICES的值
    category_post = serializers.IntegerField(write_only=True)                          # 用於反序列化的字段
    pub_time = serializers.DateField() # 外鍵字段,先聲明外鍵字段的序列化器再實例化
    publisher = PublisherSerializer(read_only=True)             # 僅在正序列化匹配該字段
    publisher_id = serializers.IntegerField(write_only=True)    # 僅在反序列化匹配該字段

    # 多對多字段,先聲明多對多字段的序列化器再實例化
    authors = AuthorSerializer(read_only=True,many=True)       # 多個模型對象使用many=True,正序列化匹配該字段
    authors_list = serializers.ListField(write_only=True)      # 反序列化匹配該字段


    # 更新對象調用update()方法
    def update(self, instance, validated_data): # instance就是傳入的模型對象
        # validated_data就是序列化的數據組成的字典

        # 若是更新的數據存在多對多的字段,就調用set方法
        if validated_data.get('authors_list',None): instance.authors.set(validated_data['authors_list']) # 根據字段取值,取不到就用對象的值
        instance.title=validated_data.get('title',instance.title) instance.save() # 返回對象
        return instance
相關文章
相關標籤/搜索