Эффективный запрос с общими отношениями

Это мои модели:

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) для получения всех комментариев к этому сообщению?


person xRobot    schedule 21.05.2010    source источник


Ответы (1)


Вы должны определить comments = generic.GenericRelation(Comment) в сообщении, чтобы обеспечить легкий доступ от сообщения к комментарию. Как только вы это сделаете, это простая обратная связь:

comments = post.comments.all()

Обратите внимание, что на самом деле это не вопрос эффективности. Получение всех связанных элементов с помощью обратной универсальной связи всегда будет сопровождаться не более чем двумя запросами: один для получения соответствующего ContentType, который автоматически кэшируется при первом поиске, и один для получения фактических элементов.

Если бы вы спросили, как максимально эффективно получить все комментарии к нескольким сообщениям, я бы указал вам на мой блог за хорошую технику, но, поскольку вы этого не сделали, я не буду, потому что это было бы просто шлюхой в блоге.

person Daniel Roseman    schedule 21.05.2010