models.py
from django.db import models # Create your models here. __all__ = ["Book", "Publisher", "Author"] class Book(models.Model): title = models.CharField(max_length=32) CHOICES = ((1, "python"), (2, "linux"), (3, "go")) category = models.IntegerField(choices=CHOICES) pub_time = models.DateField() publisher = models.ForeignKey(to="Publisher") authors = models.ManyToManyField(to="Author") class Publisher(models.Model): title = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32)
serializers.py
from rest_framework import serializers from .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) class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) title = serializers.CharField(max_length=32) pub_time = serializers.DateField() # CHOICES = ((1, "python"), (2, "linux"), (3, "go")) # category = serializers.ChoiceField(choices=CHOICES) category = serializers.CharField(source="get_category_display", read_only=True) post_category = serializers.IntegerField(write_only=True) publisher = PublisherSerializer(read_only=True) authors = AuthorSerializer(many=True, read_only=True) publisher_id = serializers.IntegerField(write_only=True) author_list = serializers.ListField(write_only=True) def create(self, validated_data): #通过ORM操作给Book表增加数据 print(validated_data) book_obj = Book.objects.create(title=validated_data["title"], pub_time=validated_data["pub_time"], category=validated_data["post_category"], publisher_id=validated_data["publisher_id"]) book_obj.authors.add(*validated_data["author_list"]) return book_obj
urls.py
from django.conf.urls import url, include from .views import BookView, BooksView, BookEditView urlpatterns = [ # url(r‘^list$‘, BookView.as_view()), url(r‘^list$‘, BooksView.as_view()), url(r‘^retrieve/(?P<id>\d+)$‘, BookEditView.as_view()), ]
views.py
from django.shortcuts import render from django.views import View from django.http import HttpResponse, JsonResponse from .models import Book, Publisher from django.core import serializers from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import serializers from .serializers import BookSerializer import json # Create your views here. # book_list = [ # { # "id": 1, # "title": "", # "publisher": { # "id": 1 # "title": "" # }, # "authors": [{}] # }, # { # # } # ] class BookView(View): # 第一版用.values实现序列化 # def get(self, request): # book_queryset = Book.objects.values("id", "title", "pub_time", "publisher") # # queryset [{}, {}] # book_list = list(book_queryset) # ret = json.dumps(book_list, ensure_ascii=False) # return HttpResponse(ret) # ret = [] # for book in book_list: # publisher_obj = Publisher.objects.filter(id=book["publisher"]).first() # book["publisher"] = { # "id": publisher_obj.id, # "title": publisher_obj.title # } # ret.append(book) # return JsonResponse(ret, safe=False, json_dumps_params={"ensure_ascii": False}) # 第二版 def get(self, request): book_queryset = Book.objects.all() ret = serializers.serialize("json", book_queryset, ensure_ascii=False) return HttpResponse(ret) class BooksView(APIView): def get(self, request): # print(request._request) book_queryset = Book.objects.all() # 声明一个序列化器 # 用序列化器去序列化queryset ser_obj = BookSerializer(book_queryset, many=True) return Response(ser_obj.data) # 前端 {"id""title", # category: 1 # publisher: 1 # authors: [1, 2] # } def post(self, request): # 获取前端传过来的数据 book_obj = request.data # 用序列化器做校验 ser_obj = BookSerializer(data=book_obj) if ser_obj.is_valid(): ser_obj.save() print(ser_obj.validated_data) return Response(ser_obj.data) return Response(ser_obj.errors) class BookEditView(APIView): def get(self, request, id): book_obj = Book.objects.filter(id=id).first() pass # {"title": "xxxx"} def put(self, request, id): pass
APIView跟View区别
-- APIView继承了View
-- scrf的豁免
-- 重新封装了request
旧的request给了request._request
request.query_params 旧的request.GET
request.data 除了GET的所有的信息
序列化组件
-- 序列化
--一定要记得在setting.py 中的app里面加上rest_framework ←这个很重要
-- 声明一个序列化器
class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False)
title = serializers.CharField(max_length=32)
pub_time = serializers.DateField()
-- 视图里序列化我们的queryset
ser_obj = BookSerializer(queryset, many=True)
return Response(ser_obj.data)
-- 实现流程
-- 如果指定了many=True
-- 把queryset当成可迭代对象去循环 得到每个模型对象
-- 把每个模型对象放入序列号器进行序列化
-- 进行字段匹配 匹配上的字段进行序列化 匹配不上丢弃
-- 必须满足序列化的所有字段要求
-- 反序列化
-- 获取前端传过来的数据
-- 用序列化器进行校验
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)
-- 写create方法
在create方法里用ORM操作创建新对象
-- 序列化以及反序列化的时候字段类型不统一的情况
-- required=False
-- read_only=True
-- write_only=True
原文地址:https://www.cnblogs.com/cavalier-chen/p/10099024.html