2013-05-20 3 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' 

나는 장고 검색어 세트와 많은 실험,하지만 난 결국 파이썬 문으로 끝났다.

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

아직도 나는 이것이 자주 반복되는 패턴으로 더욱 장고와 같은 솔루션이 있다면 궁금합니다.

다음 줄에있는 해결책은 부분적으로 만 문제를 해결합니다. 최신 개정판 만 나열하지만 이전 개정판에서 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 두 번째 코드 블록에서 원하는 것을 정확히 얻을 수 있습니다. 장고 queryset에 의해 솔루션에 대해 자세히 알고 싶습니다. – user1491229

답변

1

당신이 SlugPage를 통해 그것을 통과 할 경우이 작업을 수행 할 수 있습니다.

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

그리고

이 당신에게 .filter()modified 분야별 최신 일치하는 모든 Revision 개체를 얻을 것이다.

+0

답변 해 주셔서 감사합니다. 그러나 이것이 제가 찾고있는 답변이 아닌 것 같습니다. 어쨌든 그 방향으로 생각하면 도움이 될 것입니다. 검색어 세트가 모든 수정본을 필터링하지만, 가장 최근의 수정본 만 필터링하면됩니다. 가능한 경우 "current_set"과 같은 것입니다. – user1491229

+0

@ user1491229 답변을 업데이트했습니다. –