【问题标题】:How can I made this random blog post redirect for my Django app more efficient如何使我的 Django 应用程序的这个随机博客文章重定向更有效
【发布时间】:2012-09-27 09:07:27
【问题描述】:

我在我的网站上创建了一个随机的博客文章链接,并且它使用的代码有效。当我创建它时,由于它一直说'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 redirect URL to latest created blog post 这样的解决方案

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

查询集错误的旧代码:

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

return HttpResponseRedirect(path)

【问题讨论】:

    标签: python django redirect random blogs


    【解决方案1】:

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

    这是获取随机发布帖子的更有效(数据库方面)方法

    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)
    

    【讨论】:

    • random_post = random.choice(published_posts)
    • 我不确定random.choice() 是如何工作的,但它可以尝试将published_posts 查询集转换为一个列表,这将是一个大型数据库查找。
    【解决方案2】:
    1. 最好使用redirect 和反向网址;
    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 名称 blog_post:

    url(r'^post/(\w+)$', 'view_name', name='blog_post')
    

    【讨论】:

    • 在我的模型或 URL 中我需要做些什么,因为它现在得到一个错误:Reverse for 'blog_post' with arguments '(u'flash-player-control-bar',)'并且找不到关键字参数“{}”。
    • 啊,太好了!作品 :) 必须在我的前面添加 url 位,因为我的只是一个普通的 (r'post/....)
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多