django orm case when then 有条件的更新

本文介绍了如何在Django ORM中利用Case When Then结构进行有条件的数据更新,避免了针对不同条件编写多条SQL更新语句的需求。通过对classroom_users表的数据进行筛选,满足特定条件时执行相应的更新操作。

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

当我们得到了一个数据集,需要更新到数据库,但并不是每条数据都需要更新,只有符合条件的需要更新,这时写一个sql,会怎么写。如果使用普通的update … set 写就需要多条。sql中有case when then的语句

UPDATE `classroom_users`
SET `name` = CASE           
WHEN (classroom_users.uid = 189) THEN
	'李艳1'

ELSE
	NULL
END,
 `account` = CASE
WHEN (`classroom_users`.`uid` = 189) THEN
	'18611110001'

ELSE
	NULL
END,
 `gender` = CASE
WHEN (`classroom_users`.`uid` = 189) THEN
	0

ELSE
	NULL
END
WHERE uid in (189)

更新classroom_users表,符合when的条件时附加then的结果。

django也有这种用法。

from django.db.models import Case, When, Value
User.objects.filter(account__in=(189, )).update(
     name=Case(
         When(classroom_users.uid=189,
              then=Value('李艳1')),
     ),
     account=Case(
         When(classroom_users.uid=189,
              then=Value('18611110001')),
     ),
     gender=Case(
         When(classroom_users.uid=189,
              then=Value('0')),
     ),
)

当有多个项时需要自己构造一下

from django.db.models import Case, When, Value
students = json.loads(students).get('data')    # 得到所有学生

upload_uid = []        # 需要更新的uid
names = []
taccounts = []
genders = []
isdeletes = []
s = []                # 需要批量创建的列表
for student in students:          当account=user_id 时更新对应的值,构建多个When对象加到列表里
    user_id = student['user_id']
    upload_uid.append(user_id)
    username = student['username']
    full_name = student['full_name']
    sex = student['sex']

    name = When(account=user_id, then=Value(full_name))
    names.append(name)
    taccounts.append(When(account=user_id, then=Value(username)))
    if sex == None:
        sex = 'secret'

    genders.append(When(account=user_id, then=Value(sex)))
    isdeletes.append(When(account=user_id, then=Value(0)))

names = Case(*names, output_field='user_id')       根据多个when的列表生成对应的Case对象
taccounts = Case(*taccounts, output_field='user_id')
genders = Case(*genders, output_field='user_id')
isdeletes = Case(*isdeletes, output_field='user_id')

User.objects.filter(account__in=upload_uid).update(
    name=names,
    taccount=taccounts,
    gender=genders,
    isdeleted=isdeletes
)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值