如果有两个 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)