基于字典值在Django中更新模型

时间:2016-09-24 10:08:52

标签: python sql django

我在Django中有一个字典,包含模型的键和一些值。我想更新模型的字段(得分)之一(得分),如下所示: 将所有记录的该字段乘以常量,然后,如果在字典中找到记录,则将相应的字典值添加到字段中。有很多记录,获取然后保存每个对象需要很多时间。我尝试了这个更新查询,但它无法正常工作:

A.objects.update(score=F('score') * CONST + (dictionary[F('key')] if F('key') in dictionary else 0))

问题是所有记录的条件似乎都是假的,我试图调试问题,似乎F('key')没有所需的值(字符串)。

有关详细信息,此行具有正确的结果:

a = A.objects.get(key='key1') a.score * CONST + (dictionary[a.key] if a.key in dictionary else 0)

2 个答案:

答案 0 :(得分:2)

在这里使用字典查找是没有意义的;这被转换为单个SQL查询,F()的值未在Python中解析,因此无法在字典中查找它。

相反,您可能需要使用conditional expression

答案 1 :(得分:1)

借用@Daniel Roseman的答案,您可以使用条件表达式,我们可以使用通用的方法。我自己就是这么做的。

首先,我们将生成一个When表达式列表,用于Case表达式。

when_criteria = [When(key=key, then=value) for key, value in dictionary.items()]

我们将使用Python的*运算符将列表扩展为可以传递给函数的参数列表,在本例中为Case

A.objects.update(score=F('score') * CONST + Case(*when_criteria,
 default=0)

当然,我没有在更新方法上尝试这个,但它确实适用于注释。