2012-01-09 1 views
0

게시물, 견적, 이미지, 링크 등 Tumblr의 항목과 같은 다양한 것들에 대한 클래스가 포함 된 장고 앱이 있습니다. 이러한 각 개체에는 datetime이 있습니다.Django를 사용하면 다른 객체로 된 날짜순 페이지의 Tumblr 스타일 시리즈를 어떻게 만들 수 있습니까?

모든 유형의 가장 최근 항목 20 개를 결합한 목록을 표시하고 싶습니다. 이전 항목을 통해 페이지를 다시 게시 할 수 있기를 원합니다. Tumblr의 페이지처럼.

class CombinedItem(models.Model): 
    date = models.DateTimeField() 
    item_type = models.CharField() # eg, 'post', 'quote', 'image', 'link' 
    item_id = models.IntegerField() 

그리고에 새 항목을 추가

그러나 나는 내가 뭔가를 별도의 클래스를 작성해야 ... 개체의 다양한 종류에 걸쳐이 같은 쿼리를 수행하는 방법을 생각할 수 없다 그 때마다 새 게시물, 견적, 이미지, 등등을 추가합니다. 그리고 나서, 내 목록에 대해 가장 최근 항목에 대한 CombinedItem 클래스를 쿼리 한 다음 반환하는 각 항목의 기본 세부 정보를 가져옵니다. 그렇다면 모든 것을 수행하는 가장 효율적인 방법은 무엇입니까? 감사.

답변

3

가장 좋은 방법은 실제로 반대 방향으로 작업하는 것입니다. 그 각각의 사용자 생성 콘텐츠의 유형입니다, 그래서 그들은 모두가 공통 기본에서 상속해야합니다

class ContentItem(models.model): 
    # common fields here 

class Post(ContentItem): 
    # post specific fields 

.... 

그런 다음, 당신은 단순히 기본 모델 ContentItem를 조회하고 모든 목록을 얻을 수 있습니다.

유일한 잠재적 인 문제

결과는하지만, MTI (멀티 테이블 상속)의 장고의 구현에, 자식 클래스는 부모 클래스의 특성입니다 ContentItem의하지 Post의, Quote의 등 때문이다. 그래서 "0125"는 " .post"속성을 가지며, Post에 액세스 할 수 있습니다. 이것을 hasattr과 결합하여보기에서 사용할 수있는 유틸리티 메소드를 작성할 수 있습니다. 예를 들면 :

class ContentItem(models.Model): 
    ... 
    def is_post(self): 
     return hasattr(self, 'post') 

그런 다음 템플릿 :

{% if content_item.is_post %} 
    <!-- do some post-specific rendering here --> 
{% endif %} 
+0

정말 고마워요. 아주 유용한 예제입니다! 나는 많은 조인 또는 목록의 모든 항목에 대한 쿼리로 끝날 것 같아요 ...하지만 그건 아마도 피할 수없는 일이지만 나는 이것을합니다. 다시 한번 감사드립니다. –

+0

유감스럽게도 "자식"속성은 본질적으로 역 관계이며,'select_related'는 그러한 관계를 따르지 않습니다. 그러나 Django 1.4가 히트 할 때, 새로운'prefetch_related'는 모든 것을 한 번에 선택할 수 있어야합니다. 그 동안 기본적으로 같은 것을 구현하는 django-batch-select도 확인할 수 있습니다. –

1

더 깨끗한 방법은 Item (또는 원하는 경우 CombinedItem)이라는 일반 모델을 만들고이 모델을 상속하는 여러 모델 (Post, Quote, Image 등)을 만드는 것입니다. Django는 모델 상속을 염두에두고 설계되었으며 구체적인 요구 사항은 multi-table inheritance이라는 기능으로 덮여 있습니다.

이 기술을 사용하면 데이터베이스에서 개별 쿼리를 실행할 수있는 항목, 게시물, 인용문 등의 테이블이 달라집니다.

+0

감사 앙투안, 나는 그 생각을 가져야한다 - 내가 잠시 동안 떨어져 장고에서 봤는데 알 수 있습니다. 나는 여분의 예 때문에 Chris Pratt 's를 답으로 표시했다. –

+0

=) 환영합니다 =) –

0

당신은 [1], 당신이 기술 한 내용과 거의 동일한 구조를 생성합니다 이는 GenericForeignKey를 사용할 수 있습니다.

가장 큰 차이점은 item_type 필드는 실제로 장고가 자동으로 유지 관리하는 contenttypes 테이블에 대한 외래 키일 것입니다.

아쉽게도 표준 ORM filter() 메소드는 해당 필드에서 작동하지 않습니다. 날짜 범위에 대해 모델을 개별적으로 쿼리해야합니다.

일반 외래 키와 비정규 된 최종 수정 시간 소인 필드를 결합하여 관련된 개체가 변경 될 때마다 업데이트 한 다음 해당 필드에 대해 매우 빠르게 쿼리하고 관련된 개체를 추출 할 수 있습니다 필요한 20 대 목록

[1] https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations

+0

감사합니다. Ian. 흥미로운 옵션이지만 Multi Table Inheritance는 이동하는 방법처럼 보입니다. –

관련 문제