使用通用关系进行高效查询

时间:2010-05-21 12:53:17

标签: django django-views django-orm

这些是我的模特:

class Comment(models.Model):

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField(_('object ID'))
    content_object = generic.GenericForeignKey()
    user = models.ForeignKey(User)
    comment = models.TextField(_('comment'))


class Post(models.Model):

    title = models.CharField(_('name'), max_length=80)         
    creator = models.ForeignKey(User, related_name="created_posts")
    created = models.DateTimeField(_('created'), default=datetime.now)
    body = models.TextField(_('body'), null=True, blank=True)

现在在我的views.py中,我收到了一篇关于这个结构的帖子:

    post = get_object_or_404(Post, id=id)

在我的views.py中,获得该帖子的所有评论的最有效查询(使用ORM)是什么?

1 个答案:

答案 0 :(得分:3)

您应该在帖子上定义comments = generic.GenericRelation(Comment),以便您从发布到评论轻松访问。一旦你完成了,这是一个简单的向后关系:

comments = post.comments.all()

请注意,这不是效率问题。通过向后泛型关系获取所有相关项目将始终产生两个查询 - 一个用于获取相关的ContentType,该类型在首次查找时自动缓存,一次用于获取实际项目。

如果你曾经问过如何尽可能有效地获得多个帖子的所有评论,我会指向my blog以获得一个好的技巧,但是因为你没有我不会因为那样会只是在博客上唠叨。