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

本文介绍了一种在Django RESTful开发中处理PATCH请求的方法,通过改进views逻辑,实现前端仅传递需更新的部分字段即可完成数据库记录的更新,提高了开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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})
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值