DRF:GenericAPIView + ModelSerializer 实现接口
1、模型类:
class Auhtor(models.Model):
name = models.CharField(max_length=100,verbose_name='作者',unique=True)
phone = models.CharField(max_length=15,verbose_name='手机号',unique=True)
address = models.CharField(max_length=200,verbose_name='地址',null=True)
2、model序列化器:
from rest_framework import serializers
from . import models
import re
from rest_framework.exceptions import ValidationError
class AuthorModelSerializer(serializers.ModelSerializer):
class Meta:
model = models.Auhtor
fields = ['id','name','phone','address']
extra_kwargs = {
'id':{'read_only':True},
'phone':{
'max_length':11,
'min_length':11,
'error_messages':{
'max_length':"确保手机号码是11位",
'min_length':'确保手机号码是11位'
}
},
}
#局部钩子函数,检验单个字段
def validate_phone(self,value):
if re.findall('^1[3456789]\d{9}$', value):
return value
raise ValidationError('手机号码是否非法的')
#全局钩子,检验多个字段,
def validate(self,attr):
print(attr)
return attr
3、视图函数书写
创建和展示所有用户,在一个视图中:
from rest_framework.generics import GenericAPIView
class AuthorGenericAPIView(GenericAPIView):
serializer_class = serializer.AuthorModelSerializer
queryset = models.Auhtor.objects.all()
authentication_classes = []
def get(self,request):
authors = self.get_queryset()
ser = self.get_serializer(instance=authors,many=True)
return Response(data=ser.data,status=200)
def post(self,request):
author = request.data
ser = self.get_serializer(data = author)
ser.is_valid(raise_exception=True)
ser.save()
return Response(data=ser.data,status=200)
#路由设置
path('v1/api/author/',views.AuthorGenericAPIView.as_view()),
获取单个数据、更新数据(全部更新和局部更新)、删除数据,在一个视图中:
from rest_framework.generics import GenericAPIView
class AuthorPKGenerivAPIView(GenericAPIView,UpdateModelMixin):
authentication_classes = []
queryset = models.Auhtor.objects.all()
serializer_class = serializer.AuthorModelSerializer
def get(self,request,pk):
author = self.get_object()
ser = self.get_serializer(instance = author)
return Response(data=ser.data,status=200)
def put(self,request,pk):
author = self.get_object()
ser = self.get_serializer(instance = author,data = request.data)
ser.is_valid(raise_exception=True)
ser.save()
return Response(data=ser.data,status=200)
def patch(self,request,pk):
author = self.get_object()
ser = self.get_serializer(instance=author, data=request.data,partial=True)
#数据的部分更新,就是前端传递多少字段,就更新多少字段的数据,需要传递参数partial=True
ser.is_valid(raise_exception=True)
ser.save()
return Response(data=ser.data, status=200)
#路由设置
path('v1/api/author/<int:pk>/',views.AuthorPKGenerivAPIView.as_view())
127.0.0.1:8000/v1/api/author/1/
#根据请求的类型,就可以操id是1的作者数据了。