用另一种方式编写django查询

时间:2014-11-02 16:49:19

标签: python django python-2.7 django-models django-queryset

我有这个简单的论坛应用程序:

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-model开始呢?像Board.objects...一样?所以我的董事会课程中不需要任何进一步的方法并使用内置的东西吗?

1 个答案:

答案 0 :(得分: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

但是,您的初始方法对我来说似乎更具可读性。