gpt4 book ai didi

django - 如何在有条件的情况下进行Django更新?

转载 作者:行者123 更新时间:2023-12-04 22:32:33 26 4
gpt4 key购买 nike

我想使用Django根据字段的当前值将其更新为不同的值,但是我没有弄清楚如何在不执行2条单独的update语句的情况下进行操作。

这是我想做的事的一个例子:

now = timezone.now()
data = MyData.objects.get(pk=dataID)
if data.targetTime < now:
data.targetTime = now + timedelta(days=XX)
else:
data.targetTime = data.targetTime + timedelta(days=XX)
data.save()

现在,我想使用update()语句来避免覆盖数据上的其他字段,但是我不知道如何在单个update()中进行操作。我尝试了一些类似这样的代码,但是第二次更新没有使用最新时间(我最后得到的字段等于当前时间):
# Update the time to the current time
now = timezone.now()
MyData.objects.filter(pk=dataID).filter(targetTime__lt=now).update(targetTime=now)
# Then add the additional time
MyData.objects.filter(pk=dataID).update(targetTime=F('targetTime') + timedelta(days=XX))

有没有一种方法可以将其简化为单个update()语句?类似于SQL CASE语句吗?

最佳答案

您需要像这样使用conditional expressions

from django.db.models import Case, When, F

object = MyData.objects.get(pk=dataID)
now = timezone.now()
object.targetTime = Case(
When(targetTime__lt=now, then=now + timedelta(days=XX)),
default=F('targetTime') + timedelta(days=XX)
)
object.save(update_fields=['targetTime'])

为了进行调试,请尝试在 save之后立即运行此命令,以查看刚刚运行了哪些SQL查询:
import pprint
from django.db import connection
pprint.pprint(["queries", connection.queries])

我已经用整数测试了它,并且可以在Django 1.8中使用,但我还没有尝试过日期,因此可能需要进行一些调整。

关于django - 如何在有条件的情况下进行Django更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17155427/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com