从父调用Django子模型方法需要InheritanceManager?

时间:2017-06-22 20:07:29

标签: python django

我的Django应用程序有一个Post类,它有几个子类TextPostAudioPost等,每个子类都有自己的render_html()方法。

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,直到我找到一个不引发异常,或者使用{{ 1}}公用事业经理。这两种方式中的一种是最好的方法吗?或者我应该做些什么?

2 个答案:

答案 0 :(得分:0)

我建议你的问题的另一种方法,你可以用它来获取基类的所有子类。由于您不需要手动为每个子类设置查询,因此它会有点方便

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

您所参考的方法适用于java,但我不认为它可以在这里工作。您可以手动使用子类,也可以使用上面提到的子类函数获取所有子类。

答案 1 :(得分: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