建立model数据库

from django.db import models

__all__ = ['Book', 'Publisher', 'Author']

# Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
CHOICES = ((1, 'python'), (2, 'linux'), (3, 'go'))
category = models.IntegerField(choices=CHOICES, default=1, verbose_name='分类')
pub_time = models.DateField(verbose_name='出版日期')
publisher = models.ForeignKey(to='Publisher', verbose_name='出版社')
authors = models.ManyToManyField(to='Author', verbose_name='作者') class Meta:
db_table = 'book'
verbose_name = '书籍表'
verbose_name_plural = verbose_name def __str__(self):
return self.title class Publisher(models.Model):
name = models.CharField(max_length=32, verbose_name='出版社')
address = models.CharField(max_length=32, verbose_name='地址') class Meta:
db_table = 'publisher'
verbose_name = '出版社表表'
verbose_name_plural = verbose_name def __str__(self):
return self.name class Author(models.Model):
name = models.CharField(max_length=32, verbose_name='作者')
country = models.CharField(max_length=32, verbose_name='国家') class Meta:
db_table = 'author'
verbose_name = '作者表'
verbose_name_plural = verbose_name def __str__(self):
return self.name

数据库部分一共三张表,书籍表以及作则和出版社表

admin注册

from django.contrib import admin
from SerDemo import models
# Register your models here.
for table in models.__all__:
admin.site.register(getattr(models,table))

这里用到了小技巧,利用导入的models.__all__循环批量注册model模型

序列器的实现

在项目下新建serializers,py文件

from rest_framework import serializers
from SerDemo.models import Book, Author, Publisher # 自定义检验函数在字段参数validators中作为参数添加
def my_validate(value):
if "敏感词汇" in value.lower():
raise serializers.ValidationError("输入的信息含有敏感词汇")
return value ### 创建django序列化器类,继承serializers.ModelSerializer字段可自动关联
class BookSerializer(serializers.ModelSerializer):
## 需要重写的字段,SerializerMethodField 会去找get_字段名的函数并执行获取返回值作为字段值
category_read = serializers.SerializerMethodField(read_only=True,validators=[my_validate,])
publisher_read = serializers.SerializerMethodField(read_only=True)
authors_read = serializers.SerializerMethodField(read_only=True) # category_read的钩子函数,返回要显示的值,注意obj是每个要显示到前端的数据对象
def get_category_read(self,obj):
return obj.get_category_display() # publisher_read的钩子函数,返回要显示的值
def get_publisher_read(self,obj):
return {'id':obj.publisher_id,'title':obj.publisher.name} def get_authors_read(self,obj):
ret = [{'id':i.id,'name':i.name} for i in obj.authors.all()]
return ret ## 全局校验钩子函数
def validate(self, attrs):
# attrs 包含所有字段的数据
if 'se' in attrs['title']:
#如果敏感词汇在title字段中则抛出错误
raise serializers.ValidationError('含有敏感词汇')
# 否则返回原信息
return attrs # 局部校验钩子函数validate_+字段名
def validate_title(self, data):
if 'se' in data:
raise serializers.ValidationError('含有敏感词汇')
return data # 序列化器的元信息
class Meta:
# 绑定的数据表model
model=Book
#要展示的表的字段
fields = '__all__'
# depth = 1
# depth 让你所有的外键关系变成read_only=True,不建议使用
# 额外要添加的字段的属性参数
extra_kwargs = {
'category':{'write_only':True},
'publisher': {'write_only': True},
'authors':{'write_only':True},
}

路由以及视图函数部分

from django.conf.urls import url
from SerDemo.views import BooklistView,EditBookView
urlpatterns = [
# 展示书籍信息路由
url(r'^booklist/',BooklistView.as_view()),
#编辑书籍路由,接受id参数
url(r'^editbook/(?P<id>\d+)/',EditBookView.as_view())
]

视图部分

展示所有书籍数据和添加数据视图,

class BooklistView(ListCreateModelMixin):
#get 请求发送所有数据给前端
def get(self, request):
# 获取数据库中所有数据对象
query_set = Book.objects.all()
# 将queryset对象传给序列化器实例化,many=True告诉序列化器这是多个对象
ser_obj = BookSerializer(query_set, many=True)
# 所有要显示的数据都在ser_obj.data中用restframe的Response返回
return Response(ser_obj.data) # post请求为添加数据
def post(self, request):
# 序列化前端传过来的数据(request.data)
ser_obj = BookSerializer(data=request.data)
# 校验各字段数据是否符合要求
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors)

编辑数据和删除书籍部分

class EditBookView(UpdateDestroyModelMixin):
# 展示当前要编辑的数据对象
def get(self, request, id):
#根据url中的id参数获取要编辑数据对象
book_obj = Book.objects.filter(id=id).first()
if book_obj:
# 返回给前端页面
ser_obj = BookSerializer(book_obj)
return Response(ser_obj.data)
return Response('没有') #put请求对应修改数据
def put(self, request, id):
#根据url中的id参数获取要编辑数据对象
book_obj = Book.objects.filter(id=id).first()
if book_obj:
#将前端提交的数据和要修改的对象传给序列化器partial=True允许只修改部分字段数据
ser_obj = BookSerializer(data=request.data, instance=book_obj, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) def delete(self,request,id):
book_obj = Book.objects.filter(id=id).first()
if book_obj:
book_obj.delete()
return Response('')
return Response('没有次对象')

模仿djngo restframe源码封装各个方法

from django.shortcuts import render, HttpResponse, redirect
from django.http import JsonResponse
import json
from SerDemo.models import Author, Publisher, Book
from django import views
from rest_framework import serializers
from rest_framework.views import APIView
from rest_framework.response import Response
from SerDemo.serializers import BookSerializer # 把每个方法抽离出来 class GenericAPIView(APIView):
query_set = None
serializer_class = None
def _get_queryset(self):
return self.query_set
def _get_serializer(self,*args,**kwargs):
return self.serializer_class(*args,**kwargs) class ListModelMixin:
def list(self):
query_set = self._get_queryset().all() ser_obj = self._get_serializer(query_set, many=True)
return Response(ser_obj.data) class CreateModelMixin:
def create(self,request):
ser_obj = self._get_serializer(data=request.data)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) class RetrieveModelMixin:
def retrieve(self,id):
book_obj = self._get_queryset().filter(id=id).first()
if book_obj:
ser_obj = self._get_serializer(book_obj)
return Response(ser_obj.data)
return Response('没有') class UpdateModelMixin:
def update(self,request,id):
book_obj = self._get_queryset().filter(id=id).first()
if book_obj:
ser_obj = self._get_serializer(data=request.data, instance=book_obj, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.data)
else:
return Response(ser_obj.errors) class DestroyModelMixin:
def destroy(self,id):
book_obj = self._get_queryset().filter(id=id).first()
if book_obj:
book_obj.delete()
return Response('')
return Response('没有次对象') class ListCreateModelMixin(GenericAPIView,ListModelMixin, CreateModelMixin):
pass class UpdateDestroyModelMixin(GenericAPIView,DestroyModelMixin,UpdateModelMixin,RetrieveModelMixin):
pass class BooklistView(ListCreateModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer
def get(self, request):
# query_set = Book.objects.all()
# ser_obj = BookSerializer(query_set, many=True)
# return Response(ser_obj.data)
return self.list() def post(self, request):
# ser_obj = BookSerializer(data=request.data)
# if ser_obj.is_valid():
# ser_obj.save()
# return Response(ser_obj.data)
# else:
# return Response(ser_obj.errors)
return self.create(request) class EditBookView(UpdateDestroyModelMixin):
query_set = Book.objects.all()
serializer_class = BookSerializer
def get(self, request, id):
# book_obj = Book.objects.filter(id=id).first()
# if book_obj:
# ser_obj = BookSerializer(book_obj)
# return Response(ser_obj.data)
# return Response('没有')
return self.retrieve(id) def put(self, request, id):
# book_obj = Book.objects.filter(id=id).first()
# if book_obj:
# ser_obj = BookSerializer(data=request.data, instance=book_obj, partial=True)
# if ser_obj.is_valid():
# ser_obj.save()
# return Response(ser_obj.data)
# else:
# return Response(ser_obj.errors)
return self.update(request,id) def delete(self,request,id):
# book_obj = Book.objects.filter(id=id).first()
# if book_obj:
# book_obj.delete()
# return Response('')
# return Response('没有次对象')
return self.destroy(id)

Django restframe 视图函数以及ModelSerializer的使用的更多相关文章

  1. Django之视图函数总结

    Django之视图函数总结 HttpRequest与HttpResponse http请求中产生两个核心对象: HttpRequest对象:用户请求相关的所有信息(对象) HttpResponse对象 ...

  2. django views视图函数返回值 return redirect httpresponse总结

    django views视图函数返回值 return redirect  render httpresponse总结

  3. Django 定义视图函数

    Django 定义视图函数 一.接收内容及文件处理 1.接收分类 # 获取数据 request.GET # 提交数据 request.POST # 获取文件 request.FILES 2.check ...

  4. 03 Django之视图函数

    一.Django的视图函数view 一个视图函数(类),简称视图,是一个简单的Python函数(类),它接受WEB请求并返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  5. django的视图函数

    一.视图函数view 视图函数是接收一个请求(request对象),并返回响应的函数 1. HttpResponse响应请求 这个方法是返回字符串一类的,可以识别标签 2. render响应请求 re ...

  6. Django的视图函数和路由系统中一些没有用过的小点

    1.request对象 print("返回用户访问的url,但是不包括域名",request.path_info) print("返回请求的方法,全大写",re ...

  7. django views视图函数

    Django views.py视图文件 一. 创建views.py文件,在工程文件夹根目录创建views.py视图文件,其实任意文件名都可以,使用views是为了遵循传统. 注:所有的views函数都 ...

  8. Django中非视图函数获取用户对象

    今天遇到了一个问题:在Django中怎么从非视图函数中获取用户对象?怎么保证不同的请求获取到不同的用户对象? 平常我们获取用户对象使用的是: request.user 不得不说,这确实很方便. 但是, ...

  9. django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式:CBV是指视图函数以类的方式. 2.普通FBV形式 def index(request): return HttpResponse('in ...

随机推荐

  1. java 基础 动态绑定和多态

  2. 深入理解消息中间件技术之RabbitMQ服务

    什么叫消息队列? 消息(Message)是指在应用间传送的数据.消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象. 消息队列(Message Queue)是一种应用间的通信方式, ...

  3. 你不知道的腾讯社招面试经验(已offer)

    # 你不知道的腾讯社招面试经验(已offer) ## 背景 最近一段时间换工作,成功获得了腾讯的offer.在这里有点经验跟大家分享,我觉得,比起具体的面试题,有些东西更加重要,你知道这些东西,再去准 ...

  4. Vue(三)之前端路由

    01-前端路由 1.前端路由的实现原理 vue+vue-router 主要来做单页面应用(Single Page Application) 为什么我们要做单页面应用? (1)传统的开发方式 url改变 ...

  5. LCT维护删除时间最晚生成树

    用来做动态图问题. 维护一棵删除时间最晚的生成树,这样好处是加入一条非树边时可以直接判断加还是不加,没有现在不加入而之后再加入的情况.要是我比你先被删,那我就完全没必要加.否则你现在就可以被删除掉.

  6. Contest1692 - 2019寒假集训第三十一场 UPC 11075 Problem D 小P的国际象棋

    非常简单的单点修改+区间加+区间查询.我用的是最近刚学的区间修改版本树状数组.  直接维护即可,注意修改后的单点值已经不是a[i],或者b[i],要通过区间查询求单点.不然是错的. 区间修改版本树状数 ...

  7. sql中return和returns的区别

    用户定义函数中,用RETURNS 子句指定该函数返回值的数据类型 return用于返回具体的值/值变量

  8. sso单点登录系统(解决session共享)

    场景:假设一个用户将自己的登录信息提交到后台,如果session保存的信息分布在多台机器上,并且不共享,那么可能导致用户的登录信息出现短暂的丢失,为什么这样讲,因为用户访问服务器中间还要经过负载均衡服 ...

  9. iOS-拍照后裁剪,不可拖动照片的问题

    2016.07.08 15:04* 字数 1837 阅读 6066评论 6喜欢 26赞赏 1 问题 在项目中,选择照片或拍照的功能很长见,由于我之前采用系统自带的UIimagePickViewCont ...

  10. latex 图片标题居中

    1.有一个全局图片标题居中的方法: \usepackage[justification=centering]{caption} 2.如果排版时有的图标题想左对齐,有的想居中,前一个方法就不好了,这里可 ...