2017-01-22 88 views
0

我有一個名爲Post模型,看起來像這樣:如何獲取模型的上一個和下一個對象?

class Post(models.Model): 

    title = models.CharField(max_length=18) 
    body = models.TextField() 
    date = models.DateTimeField() 


    def __str__(self): 
     return self.title 

我怎麼會得到一個和下一個帖子對象?

我試圖用1減去和1加做.objects.get(id)查找在views.py

def blog_detail(request, id): 

    post = Post.objects.get(id) 
    post_id = post.id 
    previous_post_id = int((post.id-1)) 
    next_post_id = int((post.id+1)) 

    # Next post 
    try: 
     next_post = Post.objects.get(id=next_post_id) 
    except: 
     next_post = None 

    # Previous Post 
    try: 
     previous_post = Post.objects.get(id=previous_post_id) 
    except: 
     previous_Post = None 


    context = {'post': post, 'next': next_post, 'previous_post': previous_post} 
    return render(request, "BlogHome/pages/post.html", context) 

我假設我有怎樣的語法著作的誤解。

+7

上一個和下一個關於哪個/什​​麼? –

+0

@MosesKoledoye對於任何特定的Post對象,如果我有Post.id == 2的Post對象,我會得到Post.id == 1和Post.id == 3。我嘗試了[get_next_by_FOO()](https://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_next_by_FOO)方法,但似乎沒有完成我想要做的事情。 –

+0

你怎麼知道ID是1和3?你應該展示你的嘗試 – Sayse

回答

2

你不能依靠具體的id來存在於數據庫中。它們可能已被刪除,或者pk序列可能被操縱,或者由於事務失敗而可能被跳過。你可以儘管做到以下幾點:

# None if there's no previous 
previous_post = Post.objects.filter(id__lt=post.id).order_by('-id').first() 
# None if there's no next 
next_post = Post.objects.filter(id__gt=post.id).order_by('id').first() 

第一個查詢獲取Post實例與最大idpostid如果存在小。請注意,get_next_by_FOO方法僅適用於DateFieldDateTimeField。因此,您可以使用:

previous_post = post.get_previous_by_date() 
next_post = post.get_next_by_date() 
# both use id as tie-breaker 

但是,如果沒有下一個/上一個,這些將會引發異常。

相關問題