为什么值查询集与模型属性不匹配

Why does values query set not match model attributes

使用 django 1.7、python 3.4 和 postgres 9.4。

当我直接查询模型的属性时,它 returns 正确的值。 当我使用 .values() 查询同一模型时,它 returns 不正确的值。

例如:

>>>bomitem = self.itemproduction.billOfMaterials()
>>>for x in bomitem:
>>>    x.ratio
>>>>50
>>>>20
>>>>bomitem.values('ratio')
>>>>[{'ratio': 5}, {'ratio': 2}]

Self 和 itemproduction 是一个 OneToOneField 关系。

ItemProduction.billOfMaterials() 覆盖 Product.billOfMaterials()

def billOfMaterials(self):
    bom = self.inventoryItem.product.billOfMaterials()
    for x in bom:
        x.ratio = x.ratio * self.qty
    return bom 

这基本上是获取产品的物料清单(配方清单),并计算出生产 n 个产品的预期物料清单。 此外,当我尝试过滤 bomitem 时,生成的查询集具有相同的不正确值。

>>>>bomitem.get(component=x)
>>><BOM: Product One: 5>

为什么会出现这种不稳定的行为?

数据库中的值就是您在 .values('ratio') 中看到的值 如果您希望该值为 x.ratio = x.ratio * self.qty,则必须在使用 Python 代码和计算

初始化模型实例后将该模型实例保存到数据库中

更好的方法是使用不同的字段,一个用于 ratio,另一个用于您需要的计算值(并决定是否要将它们保存到数据库中或即时计算,除非需要,通常最好不要存储任何计算字段,这样你的数据就不会在数据库中不一致)