django 实现数据的修改

需求:点击ID跳出弹框,对这里面的数据进行修改走了很多弯路,最会采用的是将reviewers和watchers保存到数据库之前先把对应的数据库记录删掉,这相当于添加,这里最重要的是别忘了使用事务,这样一旦出现问题会回滚到之前的状态
在这里插入图片描述

在这里插入图片描述

def get_keys(d, value):
    return [k for k, v in d.items() if v == value]


def reviewerRuleAdd(request):
    check_reviewers = []
    check_watchers = []
    project = request.POST.get("project", None)
    branch = request.POST.get("branch", None)
    filename = request.POST.get("filename", None)
    reviewers = request.POST.get("reviewers", None)
    watchers = request.POST.get("watchers", None)
    remark = request.POST.get("remark", None)
    reviewlist = reviewers.split(',')
    watcherlist = watchers.split(',')
    regular = {'仓库': project, '分支名': branch, '文件名': filename}
    try:
        for key, value in regular.items():
            re.compile(value)
    except:
        msgkey = get_keys(regular, value)
        return JsonResponse({'check_msg': ''.join(msgkey) + '选项中,格式不合法,请输入一个正确的!'})

    for name in set(reviewlist):
        userbool = User.objects.filter(username=name).exists()
        if userbool:
            check_reviewers.append(name)
        elif not userbool:
            return JsonResponse({'msg': 'reviewers选项中,含有输入用户在系统不存在,请输入一个正确的!'})
    new_watcherlist = list(set(watcherlist))
    for i in range(0, len(new_watcherlist)):
        userbool = User.objects.filter(username=new_watcherlist[i])
        if len(userbool) > 0 and userbool[0].username == new_watcherlist[i]:
            check_watchers.append(new_watcherlist[i])
        elif len(userbool) == 0 or userbool[0].username not in new_watcherlist[i]:
            return JsonResponse({'msg': 'watchers选项中,含有输入用户在系统不存在,请输入一个正确的!'})
    current_id = Gerrit_Reviewer_Rule.objects.create(
        project=project,
        branch=branch,
        filename=filename,
        remark=remark)
    if len(check_reviewers)>0:
        for i in check_reviewers:
            user_ = User.objects.filter(username=i)
            for b in user_:
                Gerrit_Reviewer_User.objects.create(gtrevuser_id=int(current_id.id),type_user='reviewers',user_id=int(b.id))
    if len(check_watchers)>0:
        for j in check_watchers:
            user_ = User.objects.filter(username=j)
            for n in user_:
                Gerrit_Reviewer_User.objects.create(gtrevuser_id=int(current_id.id),type_user='watchers',user_id=int(n.id))
    return JsonResponse({'info': 'Success!'})

一开始考虑是改了reviewers或者watchers就删除该条记录,发现很麻烦而且代码太长

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Django中,你可以通过使用信号(signals)来保存数据修改记录。下面是一个示例,演示如何使用Django的信号来实现保存数据修改记录。 首先,在你的应用中创建一个`signals.py`文件,用于定义信号处理函数。这个文件应该与你的models.py文件处于同一个目录下。 ```python from django.db.models.signals import pre_save from django.dispatch import receiver from django.contrib.admin.models import LogEntry @receiver(pre_save) def save_model_change(sender, instance, **kwargs): if not instance.pk: # 如果是新的对象(即没有主键),则不保存修改记录 return # 获取原始数据 original_data = sender.objects.get(pk=instance.pk) # 比较字段值是否发生变化 changed_fields = [] for field in instance._meta.fields: if getattr(instance, field.attname) != getattr(original_data, field.attname): changed_fields.append(field.name) if not changed_fields: # 如果没有字段值发生变化,则不保存修改记录 return # 创建修改记录 LogEntry.objects.create( action_time=instance.modified, # 你的模型中包含用于记录修改时间的字段 user_id=1, # 修改记录的用户ID,你可以根据实际情况进行调整 content_type_id=ContentType.objects.get_for_model(sender).pk, object_id=instance.pk, object_repr=str(instance), action_flag=CHANGE, change_message='Changed fields: {}'.format(', '.join(changed_fields)) ) ``` 然后,在你的应用的`apps.py`文件中注册信号处理函数。 ```python from django.apps import AppConfig class YourAppConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'your_app_name' def ready(self): import your_app_name.signals # 修改为你的signals.py文件路径 ``` 最后,在你的应用的`__init__.py`文件中应用这个配置。 ```python default_app_config = 'your_app_name.apps.YourAppConfig' # 修改为你的apps.py文件路径 ``` 现在,当你修改了某个模型的数据时,修改记录将被保存到`LogEntry`模型中。你可以根据实际需求进行调整,比如修改保存修改记录的方式、记录用户信息等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

季布,

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

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

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

打赏作者

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

抵扣说明:

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

余额充值