Django:使用F()查询不符合预期的对象

时间:2011-10-02 13:37:34

标签: django django-models django-views

我试图导入价格模型来比较价格,但遇到意外结果。

我的模特:

class ProfitableBooks(models.Model):
    price = models.ForeignKey('Price',primary_key=True)

在我看来:

foo = ProfitableBooks.objects.filter(price__buy__gte=F('price__sell'))

产生此错误:

'ProfitableBooks' object has no attribute 'sell' 

1 个答案:

答案 0 :(得分:0)

这是您的实际模型还是简化?我认为问题可能在于拥有一个模型,其唯一的字段是其主键是外键。如果我尝试解析它,它似乎意味着它本质上是一个充当查询集代理的字段 - 由于主键的性质,你可能永远不会有比图书更有利可图的书。它似乎也意味着由于隐含的唯一性约束,您的省略书籍字段必须没有价格重叠。

如果我理解正确,你试图比较另一个模型中的两个值:price.buy与price.sell,并且你想知道这个未经过预测的Book模型是否有利可图。虽然我不确定F()对象究竟是如何分解的,但我的直觉是F()旨在促进一种有效的查询和更新,您可以根据另一个值来比较或调整模型值。数据库。它可能无法处理像这样的“shell”模型,除了联合主/外键之外没有任何字段,并且在进行查询的模型外部的两个值的比较(也不同于本书)具有关于书籍的识别信息的模型,我推测)。

文档说你可以在F()对象中使用连接,只要你过滤而不是更新,我假设你的价格模型有买卖字段,所以它似乎符合条件。所以我不是百分之百确定在幕后发生故障的地方。但是从实际的角度来看,如果你想要完全实现这里隐含的结果,你可以只对你的价格模型做一个简单的查询,再次b / c,ProfitableBooks模型中没有明显的数据(它只返回价格),你也暗示每个price.buy和price.sell都有一本相应的书。所以Price.objects.filter(buy__gte = F('sell'))给出你在剪辑中请求的结果。

如果您想获得作为图书对象的结果,您应该进行类似于此处的查询,但请从您的图书模型开始。您可以将该查询放在名为“profitable_books”的查询集管理器中,如果您想以某种方式证实它。