在django restful开发的过程中,对于前端传来的patch请求,这个时候我们往往只是修改部分字段。但是通常情况下我们又不得不去获得所有数据更改,或者用if else 进行匹配修改。这个过程无疑是枯燥且效率低下的。
注:本文作者并没有使用viewset,具体原因暂不讨论。这里使用的是APIView和generics.GenericAPIView
因此在本文中就是来解决这个问题,提高效率。
先看看我的模型定义:
class Group(models.Model):
name = models.CharField(max_length=64)
chname = models.CharField(max_length=64, default = '')
created = models.DateTimeField(auto_now_add=True)
is_delete = models.IntegerField(default=0)
#url = models.FileField(upload_to = "testlogo/%Y%m")
class Meta:
db_table = 'user_group'
然后看看views的逻辑:
#用来进行数据验证
class GroupInfoSerializer(serializers.Serializer):
name = serializers.CharField()
chname = serializers.CharField()
class GroupInfo(generics.GenericAPIView):
#登录验证
authentication_classes = (JWTAuthentication,)
serializer_class = GroupInfoSerializer
def patch(self,request):
'''
修改用户组
'''
request_log(request)
try:
serializer = self.get_serializer(data=request.data)
if not serializer.is_valid():
print({"message": serializer.errors, "errorCode": 4, "data": {}})
return Response({"message": serializer.errors, "errorCode": 4, "data": {}})
data = (serializer.data)
id = request.data.get('id') or ''
print(id)
if not id:
print({"message": "没有传入必要ID参数", "errorCode": 4})
return Response({"message": "没有传入必要ID参数", "errorCode": 4})
group = Group.objects.filter(id=int(id),is_delete=False).first()
if not group:
print({"message": "该用户组不存在或已删除", "errorCode": 5})
return Response({"message": "该用户组不存在或已删除", "errorCode": 5})
print(group,type(group))
# 获取该模型内所有字段名数据
fields_data = group._meta.fields
for key in data:
#这里是将当前的数据转换成数据字典,方便后面修改后提交
data_dict = group.__dict__
for field in fields_data:
#这样或输出这条记录的所有字段名,需要的话还可以输出verbose_name
print(field.name)
if field.name == key:
#进行匹配,将前端传来的字段匹配到,然后修改数据库里面的数据
data_dict[key] = data[key]
#保存数据到数据库,这样的好处就是提高效率,避免过多重复操作
group.save()
print({"message": "ok", "errorCode": 0})
return Response({"message": "ok", "errorCode": 0})
except Exception as e:
print(e)
print({"message": "未知错误", "errorCode": 3})
return Response({"message": "未知错误", "errorCode": 3})