2014-11-02 80 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