开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情
一、通过DRF视图快速实现用户增删改查
对于用户的增删改查,我们不需要去写四个接口,通过restframework提高的视图可以很方便的开发通用功能接口。
1. 创建公共视图
1)在django项目下创建comFunc文件夹,并在该文件夹下创建comViews.py文件:
2)在comviews.py文件中增加如下代码:
from rest_framework import mixins
from rest_framework.generics import GenericAPIView
class ComAllAPIView(mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.RetrieveModelMixin,
GenericAPIView):
# 查询
def get(self, request, *args, **kwargs):
if request.parser_context['kwargs']: # 如果有id,则查单个值
return self.retrieve(request, *args, **kwargs)
return self.list(request, *args, **kwargs)
# 创建
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
# 更新部分字段
def patch(self, request, *args, **kwargs):
return self.partial_update(request, *args, **kwargs)
# 删除
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
这个视图方法通过继承restframework提供的公共mixin来实现增删改查的功能(关于restframework,视图和mixin的讲解请看官方文档进行学习:www.django-rest-framework.org/api-guide/v…)
3)然后在user文件夹下创建序列化文件serializers.py:
4)加入序列化代码:
关于序列化使用和讲解,移步官方文档的serializers章节:www.django-rest-framework.org/api-guide/s…
from django.contrib.auth.models import User
from rest_framework import serializers
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
5)加入序列化代码:
在user文件夹下的views.py文件中增加相关的user视图代码,用于实现增删改查接口:
相应引入代码:
from comFunc.comViews import ComAllAPIView
from user.serializers import UserSerializer
from django.contrib.auth.models import User
视图代码
class UserView(ComAllAPIView):
serializer_class = UserSerializer
permission_classes = (IsAuthenticated,)
queryset = User.objects.all()
6)在user文件夹下的urls.py中的urlpatterns列表中增加相应url:
path('all', UserView.as_view()),
path('all<int:pk>', UserView.as_view()),
7)在user文件夹下的urls.py中增加设置app_name的代码:
app_name = "user"
8)在QNtest文件夹下的urls.py中的urlpatterns列表中将user模块的url引入:
path('user/', include('user.urls', namespace='user')),
2. 用户接口
2.1 查询用户列表接口
请求地址: http://localhost:8001/user/all
请求方法: GET
响应结果
可以看到,响应的结果中也把用户的password带出来了,这是我们不愿意看到的, 我们可以通过设置序列化方法来排除哪些字段不返回:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
exclude=('password',) # 不返回password字段
这样设置后结果就不会返回password了
但这样设置之后会有一个问题,当我们想通过序列化方法创建用户时,指定了password字段也不会进行保存
所以我们要设置password字段为只能够写,不能够读即可,设置代码如下:
class UserSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = '__all__'
2.2 修改接口
请求地址: http://localhost:8001/user/all/1
请求方法: PATCH
请求参数(修改用户id为1的邮箱地址):
{
"email":"123@qn.com"
}
2.3 删除接口
删除用户id为2的用户
请求地址: http://localhost:8001/user/all/2
请求方法: DELETE
2.3 创建接口
对于创建用户的接口,我们需要重写post方法,以至于能够设置用户的密码
在views.py文件下的UserView添加(完整userView代码):
class UserView(ComAllAPIView):
serializer_class = UserSerializer
permission_classes = (IsAuthenticated,)
queryset = User.objects.all()
def post(self, request, *args, **kwargs):
# 如果传递了password字段就用password的字段,没有则默认密码为123456
pwd = request.data.get('password', '123456')
request.data['password'] = make_password(pwd) # 调用内置生成密码方法进行加密
return self.create(request, *args, **kwargs)
创建一个用户名为:quniao,邮箱地址为:quniao@qn.com的用户
请求地址: http://localhost:8001/user/all
请求方法: POST 请求参数:
{
"username":"quniao",
"email":"quniao@qn.com"
}
四. 总结
至此,我们已经完成了用户的增删改查功能。而且只用了一个八行代码的视图和四行代码的序列化器就实现了。这是非常高效方便的。
这也是我为什么选择DRF的原因,因为太香了。
有了接口就需要进行数据的展示了,下篇博文将通过ts+react+antd来开发前端页面的展示。欢迎订阅专栏!