Эффективный запрос с родовыми отношениями - PullRequest
0 голосов
/ 21 мая 2010

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

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 я получаю сообщение с таким istruction:

    post = get_object_or_404(Post, id=id)

На данный момент в моем views.py, какой самый эффективный запрос (с ORM), чтобы получить все комментарии к этому посту?

1 Ответ

3 голосов
/ 21 мая 2010

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

comments = post.comments.all()

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

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

...