DRF视图使用: APIView+Serializer实现接口
1、模型类
class Auhtor(models.Model):
name = models.CharField(max_length=100,verbose_name='author name',unique=True)
phone = models.CharField(max_length=15,verbose_name='mobile phone',unique=True)
address = models.CharField(max_length=200,verbose_name='author address',null=True)
2、序列化器
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
name = serializers.CharField(label='author name')
address = serializers.CharField(label='author address')
phone = serializers.CharField(label='author phone',max_length=11,min_length=11,
error_messages={
'max_length':'len of phonemunber must 11'
})
def create(self, validated_data):
try:
author = models.Auhtor.objects.create(**validated_data)
return author
except Exception as e:
raise ValidationError(str(e))
def update(self, instance, validated_data):
if instance:
#判断搜索的id是否在数据库中存在
try:
#全部更新和部分更新都通过这个
instance.update(**validated_data)
return instance.first()
#返回的是更新后的数据
except Exception as e:
raise ValidationError(str(e))
else:
raise ValidationError('the data not exist,can be updated')
def validate(self, attrs):
print(attrs)
return attrs
def validate_phone(self,value):
if re.findall('^1[3456789]\d{9}$', value):
return value
raise ValidationError('type of phone is error')
3、视图使用
创建数据和查看所有数据,在一条路由上,使用一个视图类
class AuthorAPIView(APIView):
authentication_classes = []
def get(self,request):
authors = models.Auhtor.objects.all()
ser = serializer.AuthorSerializer(instance=authors,many=True)
return Response(data=ser.data,status=200)
def post(self,request):
ser = serializer.AuthorSerializer(data=request.data)
ser.is_valid(raise_exception=True)
ser.save()
return Response(data=ser.data,status=200)
#路由设置
path('v1/api/author/', views.AuthorAPIView.as_view()),
获取单个数据/更新数据/删除数据,这些在一条路由上,使用一个视图类
class AuthorPKAPIView(APIView):
authentication_classes = []
def get(self,request,pk):
instance = models.Auhtor.objects.filter(id=pk).first()
if instance:
ser = serializer.AuthorSerializer(instance=instance)
return Response(data=ser.data,status=200)
return Response(data={'error':'the data is not exist!!'},status=400)
def put(self,request,pk):
intance = models.Auhtor.objects.filter(id=pk)
ser = serializer.AuthorSerializer(instance=intance,data=request.data)
ser.is_valid(raise_exception=True)
ser.save()
return Response( data=ser.data ,status=200)
def patch(self,request,pk):
instance = models.Auhtor.objects.filter(id=pk)
ser = serializer.AuthorSerializer(instance=instance, data=request.data,partial=True)
if ser.is_valid():
ser.save()
return Response(data=ser.data, status=200)
else:
return Response(data={'error':'update failure'},status=400)
def delete(self,request,pk):
ret = models.Auhtor.objects.filter(id=pk).delete()
if ret[1]:
return Response(data={"data": "delete data success"}, status=200)
else:
return Response(data={'error': "data is not exist,can`t be delete"}, status=400)
#路由设置
path('v1/api/author/<int:pk>/', views.AuthorPKAPIView.as_view()),