2013-05-20 37 views
1

如果有兩個django模型:一個存儲頁面和一個其他相應的內容修訂版本。現在,如果我搜索一個術語,我只想考慮每個頁面的最新版本。django queryset僅查詢最新版本

from django.db import models 

class SlugPage(models.Model): 
    slug = models.CharField('slug', unique = True, max_length=255) 

    @property 
    def current(self): 
     return self.revisions.latest() 

class Revision(models.Model): 
    page = models.ForeignKey(SlugPage, related_name='revisions') 
    content = models.TextField('content', blank = True) 
    modified = models.DateTimeField('modified', auto_now=True) 

    class Meta: 
     ordering = ['-modified'] 
     get_latest_by = 'modified' 

我用django查詢集進行了很多實驗,但最終我終於得到了這樣的python語句。

search_term = "some text to look for"   
pages = [page for page in SlugPage.objects.all() if search_term in page.current.content] 

不過我不知道是否有一個更Django的類似解決方案,因爲這是一個經常重複的模式。

我在下一行中提供的解決方案僅解決了部分問題。儘管它只列出了最新版本,但即使在早期版本中search_term已從其中刪除。

from django.db.models import Max 
pages = SlugPage.objects.annotate(Max('revisions__modified')).filter(revisions__content__icontains = search_term) 
+0

你想要什麼?修改訂單?我不太明白 –

+0

有一個應用程序。名稱是[reversion](https://github.com/etianen/django-reversion)。可能有點矯枉過正,但是如果你試圖對付某些東西的版本,你可能想要使用其他功能,例如回到過去/未來的任何狀態等等。 – J0HN

+0

謝謝你考慮我的問題。對不起,不夠明確。 @Paulo我在第二個代碼塊中得到了我想要的。我想通過django queryset瞭解解決方案,如果它存在的話。 – user1491229

回答

1

如果你想通過SlugPage來遍歷它,你可以這樣做。

return self.revisions_set.filter(content__icontains=search_term).latest('modified') 

,這將讓你所有的.filter()並通過modified領域的最新匹配的Revision對象。

+0

謝謝您的回答,但恐怕這不是我正在尋找的答案。無論如何,進一步思考這個方向可能會有所幫助。您的查詢集可能會過濾所有修訂版,但我只想過濾最近修訂版。如果可能的話,就像「current_set」。 – user1491229

+0

@ user1491229我更新了答案 –