上一章介绍了DRF的快速搭建api,但REST framework自带的增删改查功能有一定局限性,下面介绍一下自己如何完成增删改查的接口
上一篇链接:https://blog.csdn.net/qq_41590764/article/details/108810761
开始
第一步:新建工程,新建app,安装restframework,配置setting,创建models模型
上面的基本操作就不过多介绍,详见上一篇,app的名称还是demo1
第二步:创建序列化器
还有另一种创建序列化器的方法,就是一步一步添加,当然上面这种代码会少很多
# 一步一步增加序列化
class UserSer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
User_id = serializers.IntegerField()
name = serializers.CharField(max_length=32)
age = serializers.IntegerField()
num = serializers.IntegerField()
password = serializers.IntegerField()
def create(self, validated_data):
return User.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.User_id = validated_data.get('User_id', instance.User_id)
instance.name = validated_data.get('name', instance.name)
instance.age = validated_data.get('age', instance.age)
instance.num = validated_data.get('num', instance.num)
instance.password = validated_data.get('password', instance.password)
instance.save()
return instance
这种方法的效果和上面的是一样的,但是可以加深对序列化器的理解,两种方法选取一个即可
第三步:编写视图函数
需要引用的库
REST框架提供了两个可用于编写API视图的包装器(wrappers)。
- 用于基于函数视图的
@api_view
装饰器。 - 用于基于类视图的
APIView
类。
下面主要介绍装饰器,当有get请求和post请求的时候,会自动检测到,并进入UserViewSet函数进行处理
@api_view(['GET', 'POST'])
def UserViewSet(request):
if request.method == "GET":
users = User.objects.all()
user = UserSer(users, many=True)
return Response(data=user.data, status=status.HTTP_200_OK)
elif request.method == "POST":
data = UserSer(data=request.data)
if data.is_valid():
data.save()
return Response(data=data.data, status=status.HTTP_200_OK)
else:
return Response(data=data.errors, status=status.HTTP_400_BAD_REQUEST)
当有get,put,delete请求的时候出发下面函数
@api_view(['GET', 'PUT', 'DELETE'])
def UserViewSetPutDelete(request, pk):
try:
# filter查询若不存在返回空,get查询不存在抛出异常
# 这里可以指定查询哪一个字段的数据,可以是name,age等
user = User.objects.get(User_id=pk)
except:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == "GET":
u = UserSer(user)
return Response(data=u.data, status=status.HTTP_200_OK)
elif request.method == "PUT":
u = UserSer(user, data=request.data)
if u.is_valid():
u.save()
return Response(data=u.data, status=status.HTTP_200_OK)
else:
return Response(data=u.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
user.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
第四步:编写urls
path的路由不能使用正则表达式,还是url好用
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', UserViewSet),
url(r'^api/(?P<pk>[0-9]+)$', UserViewSetPutDelete),
]
第五步:启动项目
访问IP地址:http://127.0.0.1:8000/api/
访问IP地址:http://127.0.0.1:8000/api/1