django ORM 获取一条model对象里的所有字段名(也可以输出verbose_name),并做局部修改更新到数据库,提高效率。

在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})

你可能感兴趣的:(Python,Django)