2011-03-21 5 views
6

페이지의 다양한 유형의 컨텐츠를 관리하기위한 시스템을 구축하려고합니다. 예를 들어, 페이지는 텍스트 컨텐츠, 하이퍼 링크 컨텐츠, 비디오 컨텐츠 ​​등을 가질 수 있습니다.Django 모델 상속 및 관리 시스템

class ContentItem(models.Model): 
    title = models.CharField(max_length=1000) 
    page_order = models.IntegerField() 
    last_update_date = models.DateTimeField(default=datetime.now()) 

    class Meta: 
     abstract = True 
     ordering = ['page_order', 'last_update_date', 'title'] 

이것은 모든 콘텐츠 항목에 대한 기본 클래스입니다 : 내 모델링 코드에서

, 나는 기본 클래스가 있습니다. 페이지 순서는 페이지에서의 위치를 ​​제어합니다. 예를 들어 page_order = 0 인 항목은 페이지 상단에 있어야합니다. 다음으로이 것을 상속 한 몇 가지 구체적인 컨텐츠 모델을 정의합니다.

class LinkContent(ContentItem): 
    url = models.URLField() 
    link_text = models.CharField(max_lenth=1000) 

class TextContent(ContentItem): 
text = models.CharField() 


class VideoContent(ContentItem): 
     title = models.CharField() 
     video_file = models.FieldField(upload_to = 'videos') 

더 많은 콘텐츠 유형이있을 수 있습니다. 그런 다음 모든 다양한 콘텐츠 유형으로 구성된 페이지 모델을 정의합니다. 이상적으로 모든 유형을 기본 유형을 기반으로 관계에 배치 할 수 있습니다. 따라서이 한 릴레이션에서 LinkContents, TextContents 및 VideoContents가 혼합되어있을 것입니다. 템플릿을 렌더링 할 때 페이지 순서를 결정하기 위해 page_order로 정렬됩니다.

class Page(models.Model): 
    contents = models.ManyToManyField(ContentItem) 
    title = models.CharField() 

이러한 체계를 만들 수있는 방법이 있습니까? 아니면 다른 유형의 모델과 하나의 관계를 맺는 것이 문제가됩니까? 나는 이것이 기본적으로 다형성을 사용하여 좋은 솔루션과 객체 지향 프로그래밍의 관점을 가지고 있음을 알고 있지만, 나는 데이터베이스 레벨에서 의미가 있는지 확신하지 못한다.

class Page(models.Model): 
    video_contents = models.ManyToManyField(VideoContent) 
    link_contents = models.ManyToManyField(LinkContent) 
    text_contents = models.ManyToManyField(TextContent) 
    title = models.CharField() 

내가이 일 것 알고 있지만 페이지에서 객체의 위치를 ​​결정하는 내 방식은 더 어려워진다 :

내가 대신 더 이런 식으로 뭔가가 필요하십니까. 모든 내용 관계를 탐색하고 page_order로 정렬 한 다음 렌더링해야합니다.

두 경우 모두 나는 각 특정 콘텐츠 형식이 상속 할 수있는 기본 클래스에서 render() 메서드를 선언하고 싶습니다. 이 방법으로 ContentItems 목록이 있으면 오리 유형을 사용하여 특정 유형에 대한 걱정없이 렌더링 할 수 있습니다.

내 마지막 질문은 내가 어떻게 이걸로 좋은 관리 장소를 만들 수 있습니까? 하나의보기에서 한 페이지를 구성하는 모든 ContentItem을 쉽게 볼 수 있도록 만들면 페이지 단위를 변경하여 쉽게 이동할 수 있습니다.

이 정보를 읽어 주셔서 감사합니다. 자세한 정보가 필요하면 알려주십시오.

답변

3

이렇게하는 것이 좋습니다. 불행히도 Django의 ORM은 모델 상속을 원하는만큼 부드럽게 처리하지 않습니다. page.contents에는 Content 개체의 QuerySet이 포함됩니다. 하위 유형에 액세스하려면 컨텐츠 객체를 다운 캐스팅하는 방법을 만들어야합니다. 문제는 개체 당 쿼리가 필요하며 신속하게 처리 할 수 ​​없다는 것입니다. This blog post은 뒤에서 select_related()을 사용하여 하나의 쿼리 세트에 혼합 된 하위 유형을 가져 오는 기술을 설명합니다.

+1

감사합니다. @jcdyer. 그것은 매우 유용한 정보였습니다. 한 가지 확실한 점은 Admin 인터페이스에서이 작업을 수행하는 방법입니다. 이상적으로, 나는 페이지의 내용을 나열하고 특정 클래스를 기반으로 항목에 대해 적절한 관리 양식을 표시하는 방법을 원합니다. 예를 들어 Page에 2 개의 LinkContents와 1 개의 TextContent가 contents 속성에있는 경우 처음 두 개를 Link 양식으로 편집하고 다른 하나는 텍스트 양식으로 편집 할 수 있습니다. 이런 식으로 간단한 방법이 있습니까? 관리자 지정을 많이했는데 그런 식으로는 본 적이 없습니다. – Jon