【问题标题】:Writing a django query the other way以另一种方式编写 django 查询
【发布时间】:2014-12-29 09:01:20
【问题描述】:

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

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...?所以我不需要在我的板类中使用任何其他方法并使用内置的东西?

【问题讨论】:

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


    【解决方案1】:

    您可以使用每个具有指向它们的外键的对象的相关管理器来从这些外键关系的另一端进行查询。默认情况下,这些所谓的反向相关管理器被命名为{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
    

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

    【讨论】:

    • 不开玩笑!您的原始解决方案对数据库进行了一次查询,但这需要一个循环。在这种情况下,反向关系并不是实现目标的最有效方法。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2018-02-27
    • 2013-12-26
    相关资源
    最近更新 更多