2017-06-22 52 views
0

我有一個Post類有幾個子類TextPostAudioPost等,每個都有自己的render_html()方法我Django應用程序。從父項調用Django子模型方法需要InheritanceManager?

class Post(models.Model): 
    author = models.ForeinKey(User,...) 
    title = models.CharField(...) 
    pub_date = models.DateTimeField(...) 
    ... 
    def render_html(self): 
     return "rendered title, author date" 

class AudioPost(Post): 
    audioFile = FileField(...) 
    def render_html(self): 
     return "Correct audio html" 
... 

每個子模型都有用於上傳,驗證和保存規則的ModelForm

在主頁視圖中,我想採取所有帖子,按日期排列並呈現它們。對我來說,這應該是越簡單

## in view 
context = { 'posts' : Post.objects.order_by('-pub_date')[:5] } 

## in template 
{{ post.render_html() | safe }} 

我記住的東西在Java中抽象類以這種方式工作。但是當我用Python這樣做時,render_html方法被調用,就好像它們是父類的每個成員一樣。我查了一下Django如何實現多表繼承,看來我需要逐個檢查生成的OneToOneFields,直到找到一個不引發異常的事件,或者使用InheritanceManager實用程序管理器。這兩種方式之一是做這件事的最佳方式還是我應該做其他事情?

+0

因爲他們*是他們的父類的*成員。如果您查詢帖子,那麼您將獲得帖子。 –

回答

0

我會建議你的問題的另一種方法,你可以用它來獲得基類的所有子類。這將是一個位的方便,因爲你不需要得到查詢集的每一個兒童類手動

qerysets_child = [child_cls.objects.all() for child_cls in vars()['BaseClass'].__subclasses__()] 

你指的方法,其適用於Java,但我不認爲這能在這裏工作。您可以手動使用子類或獲取具有上述子類功能的所有子類。

0

我通過以下方法中Post解決了這個,讓我做

{{ post.get_subclass().render_html() }} 

在模板中。假設4個小類,AudioPostVideoPostTextPostRichTextPost

from django.db import models 
from django.core.exceptions import ObjectDoesNotExist 

class Post(models.Model): 
    ... 

    ... 
    def get_subclass(self): 
     try: 
      textpost = self.textpost 
      return textpost 
     except ObjectDoesNotExist: 
      pass 

     try: 
      audiopost = self.audiopost 
      return audiopost 
     except ObjectDoesNotExist: 
      pass 

     try: 
      videopost = self.videopost 
      return videopost 
     except ObjectDoesNotExist: 
      pass 

     try: 
      richtextpost = self.richtextpost 
      return richtextpost 
     except ObjectDoesNotExist: 
      pass 

     raise ObjectDoesNotExist