django orm如何使用一次查询更新计算数据



我创建了一个关于item_buy data的特性

这是我的ORM类
class BuyData(models.Model):
buy_count = models.IntegerField(default=0)
refund_count = models.IntegerField(default=0)
refund_rate = models.FloatField(default=0.0, help_test='refund_count / buy_count')

当我创建一个关于refund的函数时,我想更新我的BuyData模型

def refund():
buy_data_queryset.update(
refund_count = F('refund_count') + 1
)
buy_data_queryset.update(
refund_rate = F('refund_count') / F('buy_count') * 100
)

但我认为这种方式是不好的,因为当这个函数调用很多时间每秒,可能这两步查询提出一些问题…

所以我找到了一些文档,并像这样修改


def refund():
with transaction.atomic():
buy_data_queryset.update(
refund_count = F('refund_count') + 1
)
buy_data_queryset.update(
refund_rate = F('refund_count') / F('buy_count') * 100
)
我认为这种方式是好的。但是我想知道如何只用一个查询就能解决这个问题

我知道这不是一个解决方案

def refund():
# not a solution
# because if refund_count is 100 and buy_count is 1000
# i want to change my refund_rate = 101 / 1000
# not 100 / 1000
buy_data_queryset.update(
refund_count = F('refund_count') + 1
refund_rate = F('refund_count') / F('buy_count') * 100
)

请给我一些建议谢谢:))

您可以一次更新多个字段:

>>> Entry.objects.filter(pub_date__year=2010).update(comments_on=False, headline='This is old')

https://docs.djangoproject.com/en/3.0/ref/models/querysets/更新或者

buy_data_queryset.update(
refund_count = F('refund_count') + 1,
refund_rate = F('refund_count') / F('buy_count') * 100
)