1

我在我的网站上创建了一个随机的博客文章链接,它使用的代码有效。当我创建它时,由于它一直说'QuerySet'对象没有属性'slug',所以让它正常工作时出现了问题,所以我想出了一个解决方法。解决方法对数据库提出了不必要的请求(我认为):

from django.http import HttpResponseRedirect
def randompost(request):
    blog_posts = BlogPost.objects.filter(post_status = 'published').order_by('?')[:1]
    blog_title = blog_posts[0]
    blog_post = get_object_or_404(BlogPost, title=blog_title)

    path = '/theblog/post/' + blog_post.slug + '/'

    return HttpResponseRedirect(path)

理想情况下,我想要一个解决方案,例如Django 将 URL 重定向到最新创建的博客文章

由于它是重定向,它是否还需要正确的 http 代码?

带有 Queryset 错误的旧代码:

blog_post = BlogPost.objects.filter(post_status = 'published').order_by('?')[:1]
path = '/theblog/post/' + blog_post.slug + '/'

return HttpResponseRedirect(path)
4

2 回答 2

3

您可能知道也可能不知道,这.order_by('?')是非常低效的,并且可能是该代码效率低下的最大根源。

这是获取随机发布的帖子的更有效(db wise)的方法

from django.shortcuts import redirect
from django.http import Http404
from random import randint

def randompost(request):
    published_posts = BlogPost.objects.filter(post_status='published')
    count = published_posts.count()
    if count == 0:
        # Raise an error or something as there are no blog posts
        raise Http404
    random_index = randint(0, count - 1)
    random_post = published_posts[random_index] 

    # Then redirect to your post
    return redirect('blog_post', random_post.slug)
于 2012-09-27T10:36:40.620 回答
1
  1. 最好使用redirect和反向 URL;
  2. 您可以使用[]语法来获取 QuerySet 的第一个对象。

更新代码:

from django.shortcuts import redirect

def randompost(request):
    blog_posts = BlogPost.objects.filter(post_status='published').order_by('?')
    latest_post = blog_posts[0]

    return redirect('blog_post', latest_post.slug)

更新:

URL 示例,反向由 url name 完成blog_post

url(r'^post/(\w+)$', 'view_name', name='blog_post')
于 2012-09-27T09:17:09.033 回答