Django F()-避免自动插入括号

Django F()-避免自动插入括号,django,django-models,django-orm,Django,Django Models,Django Orm,我使用F()在数据库表列之间进行计算。我用循环建立了一个公式。我将每个F(列)添加到每个循环周期的公式中: 1. cycle: formula = F(col1) 2. cycle: formula += F(col2) 3. cycle: formula *= F(col3) 然后我在如下查询中使用公式: test = Model.objects.all().values('id').annotate(calc=formula) Model.objects.all().values(id)

我使用F()在数据库表列之间进行计算。我用循环建立了一个公式。我将每个F(列)添加到每个循环周期的公式中:

1. cycle: formula = F(col1)
2. cycle: formula += F(col2)
3. cycle: formula *= F(col3)
然后我在如下查询中使用公式:

test = Model.objects.all().values('id').annotate(calc=formula)
Model.objects.all().values(id).anotate(calc=F(column_a)+F(column_b)*F(column_c))
当我打印(test.query)时,我得到:

正确的数学顺序是:

(col1+(col2*col3))
在这种情况下如何保持在场

如果您这样做:

test = Model.objects.all().values('id').annotate(calc=formula)
Model.objects.all().values(id).anotate(calc=F(column_a)+F(column_b)*F(column_c))
您将得到如下查询:

SELECT id, ((column_a+column_b)*column_c) as calc FROM table;
你的假设不正确。您可以使用以下方法检查查询:

print(Model.objects.values('id').anotate(calc=F(column_a)+F(column_b)*F(column_c)).query)

这是合乎逻辑的,因为对象不能更改运算符的优先级。这些是由Python语法决定的。如您所见,指定
*
的优先级高于
+

通常顺序为
列a+(列b*列c)
,因为运算符优先级由解释器确定。是的,您是正确的。如果我直接从代码中打印查询,我会得到我在问题中给出的结果,但是如果我在shell中进行测试,它会像您所说的那样工作。我必须做更多的研究,因为我是从一个字符串编程构造公式的。当我知道更多信息时,我会更新这个问题。@Silko:我认为将字符串转换为表达式的“字符串解析器”是错误的(显然该解析器没有考虑优先级)。我发现了问题所在。由于循环,存在状态发生了更改。每个循环中的方程式周围都有括号。在这种情况下如何保持在场?我更新了我的问题。@Silko:你需要更改算法。单循环机制无法做到这一点。为此,您需要类似于解析器的东西:因此需要使用堆栈、shift和reduce规则。