2011-10-02 35 views
1

我試圖導航到價格模型來比較價格,但遇到了意想不到的結果沒有表現的對象。Django的:查詢與F()爲預期

我的模型:

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' 

回答

0

這是您的實際模型或簡化?我認爲問題可能在於擁有一個只有主鍵的字段是外鍵的模型。如果我試圖解析這個問題,這似乎意味着它本質上是一個充當查詢集的代理的字段 - 由於主鍵的性質,您永遠不會擁有比價格更有利可圖的書籍。這似乎也意味着,由於隱含的唯一性限制,您的消協書籍必須不存在價格重疊。

如果我理解正確的,你想兩個值在另一種模式比較:price.buy與price.sell,你想知道這是否unpictured Book模型是盈利與否。雖然我不確定F()對象是如何在這裏崩潰的,但我的直覺是,F()旨在促進一種有效的查詢和更新,您可以根據另一個值來比較或調整模型值數據庫。它可以不配備來處理這樣的「外殼」模型,該模型具有不同的聯合主鍵/外鍵和兩個值中的兩個外部以從查詢所進行的模型(以及也從書不同的比較沒有字段具有關於書籍的識別信息的模型,我認爲)。

文檔說你可以用在F()對象加入,只要你過濾和沒有更新了,我認爲你的價格模型具有買入和賣出的領域,所以它似乎資格。所以我不能100%確定它在幕後發生了什麼。但是,從實踐的角度,如果你想完成正是這裏所隱含的結果,你可能只是做你的價格模型,B一個簡單的查詢/ C再次,有一個在ProfitableBooks模型(它只返回的價格)沒有明顯的數據,你也暗示每個price.buy和price.sell都只有一本相應的書。因此,Price.objects.filter(buy__gte = F('sell'))給出了您在剪切後請求的結果。

如果你想獲得成果,這是本書的對象,你應該做的,就像你在這裏得到了一個查詢,但是從你的書的模型開始代替。如果你想以某種方式證實它,你可以把這個查詢放在一個叫做「profitable_books」的查詢集管理器中。