django queryset仅查询最新版本

时间:2013-05-20 19:52:08

标签: python django django-queryset

如果有两个django模型:一个存储页面,另一个存储相应的内容版本。现在,如果我搜索一个术语,我只想考虑每个页面的最新版本。

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)

1 个答案:

答案 0 :(得分:1)

如果你想通过SlugPage遍历它,你可以这样做。

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

这将为您提供与Revision匹配的所有.filter()个对象以及modified字段的最新对象。