我在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)
答案 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)
当然,我没有在更新方法上尝试这个,但它确实适用于注释。