1

2 つの django モデルがある場合: 1 つはページを格納し、もう 1 つは対応するコンテンツ リビジョンです。用語を検索する場合、各ページの最新のリビジョンのみを考慮したいと考えています。

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)
4

1 に答える 1

1

経由でトラバースしたい場合SlugPageは、これを行うことができます。

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

これにより、フィールドごとに および最新のRevisionものに一致するすべてのオブジェクトが取得されます。.filter()modified

于 2013-05-21T08:26:03.357 に答える