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 賢明な) 方法です。

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. URLを使用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')
于 2012-09-27T09:17:09.033 に答える