外键字段使用get_absolute_url的最佳方法

时间:2013-08-18 15:08:02

标签: python django

如果我需要这样的网址,为评论创建get_absolute_url函数的最佳方法是什么:“/ article_url#comment-id”?

我的模特:

class Article(models.Model):
    url = models.CharField()

    def get_absolute_url(self):
        return reverse('article-detail', args=[self.url])

class Comment(models.Model):
    related_article = models.ForeignKey(Article)

我的变种:

1)非常简单,但在这种情况下,django将获取文章的所有字段,这对于主页上的“最新10条评论”这样的观点非常糟糕:

u = self.related_article.get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])

2)在这种情况下,函数将独立于Article类更改,但django将在第一个查询中获取pk,在第二个查询中获取url:

u = Article.objects.filter(pk=self.related_article_id) \
                              .only('pk') \
                              .get() \
                              .get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])

3)在这种情况下,字段'url'是硬编码的,但是django会在一个查询中获取pk和url:

u = Article.objects.filter(pk=self.related_article_id) \
                              .only('url') \
                              .get() \
                              .get_absolute_url()
return ''.join([u, '#comment-', str(self.pk)])

1 个答案:

答案 0 :(得分:0)

我不确定您是否通过在文章模型中存储网址并提供 get_absolute_url 来获得更多收益,但是,您无需担心尝试明确支持您的网址中的锚标记;只需确保您在模板中的代码中正确设置了ID。

# views.py
def article_detail(request, article_id):
    # Proper exception try/except handling excluded:
    article = Article.objects.get(id=article_id)
    article_comments = Comment.objects.filter(related_article_id=article_id)

    return render_to_response('article_detail.html', {'article': article, 
                                                      'article_comments': article_comments}

# article_detail.html
{% for article_comment in article_comments %}
    <div id='comment-{{article_comment.id}}'>
       {# Comment information here. #}
    </div>
{% endfor %}

如果您有兴趣将评论摘要列表超链接回评论出现的原始文章,那么您最好也可以为评论模型定义 get_absolute_url 函数。

编辑:假设您在主页上显示了10条最新评论,但实际文章没有出现在其中:

# views.py
def main(request):
    # Assumes timestamp exists for comments.
    # Note: This query will get EXPENSIVE as the number of comments increases,
    #       and should be replaced with a better design for a production environment.
    latest_article_comments = Comment.objects.all().order_by('creation_date')[:10]

    render_to_response('main.html', {'latest_article_comments': latest_article_comments})


# main.html
{% for article_comment in article_comments %}
    <a href="{% url 'article.views.article_detail' article_comment.related_article.id %}#comment-{{article_comment.id}}">{{article_comment.user_comment}}</a>
{% endfor %}