2014-11-02 84 views
0

我有這個簡單的論壇 - 應用:編寫的Django查詢其他方式

class Board(models.Model): 
    title = models.CharField(max_length=100) 


class Topic(models.Model): 
    board = models.ForeignKey(Board) 
    title = models.CharField(max_length=100) 


class Post(models.Model): 
    topic = models.ForeignKey(Topic) 
    body = models.TextField() 

我想算在Board所有的供求信息。一種方法是打電話:

class Board(...): 
    ... 
    def post_count(self): 
     return Post.objects.filter(topic__board=self).count() 

但是,有沒有一種方法不是從Post.objects開始,而是從Board模型開始?像Board.objects...?所以我在課堂上不需要任何進一步的方法並使用內置的東西?

回答

0

您可以使用具有指向它們的外鍵的每個對象的相關管理器從這些外鍵關係的另一端進行查詢。默認情況下,這些所謂的反向相關管理器被命名爲{model-with-foreign-key} _set,並且存在於由另一個模型的外鍵關係指向的模型的任何對象上。

Here's what the Django documentation has to say about traversing relationships in reverse order.

這裏是通過關係用你建議的問題向後工作的一個例子:

class Board(models.Model): 
    ... 
    def post_count(self): 
     count = 0 
     for topic in self.topic_set: 
      count += topic.post_set.count() 
     return count 

您最初的方法似乎更可讀的我,雖然。

+0

我想,這會降低我的表現。 – tjati 2014-11-02 19:08:18

+0

不開玩笑!您的原始解決方案只對數據庫進行單個查詢,但是這需要一個循環。這是一種反向關係不是實現目標的最有效方法的情況。 – MRHwick 2014-11-02 19:45:14